http接口说明

合集下载

一、接口HTTP协议

一、接口HTTP协议

⼀、接⼝HTTP协议⼀、接⼝API: Application Programming Interface,应⽤程序可编程接⼝1)接⼝分类硬件接⼝:具有连接功能、适配。

两个硬件设备之间的连接⽅式(⽐如⿏标和电脑通过USB接⼝连接)软件接⼝:软件程序之间数据交互的通道(⽤户界⾯是软件接⼝)2)软件接⼝分类程序内部接⼝:是客户端与服务器的接⼝,⽤来实现客户端和服务器的数据传递外部接⼝:⽐如通过第三⽅登录,第三⽅⽀付,通过调⽤外部接⼝并返回当前的系统3)常见的接⼝协议webService接⼝:使⽤soup协议通过http传输,请求报⽂和返回报⽂都是xml格式的,常⽤测试⼯具有soupUIhttp协议接⼝:⽬前使⽤最⼴泛的,使⽤HTTP协议来传输数据,常见的请求⽅法有get、post等,常⽤测试⼯具有postman、jmeter dubbo、 websocket、 ws://...、 ftp://等协议。

4)接⼝测试本质是基于某种协议,发送⼀个请求给服务器,然后服务器返回⼀个响应,然后对响应数据进⾏分析,判断是否与我们预期的返回⼀致,从⽽验证功能是否正确。

⼆、HTTP协议解读1)http协议:超⽂本传输协议2)https:简单的来说,就是http的安全版,在http下加⼊了SSL层(SSL主要⽤户web的安全传输协议)3)http的默认端⼝号是:80 ,默认的端⼝在url可以不加 https的默认端⼝号是:443 ,默认的端⼝在url可以不加4)HTTP请求过程客户端:PC端的应⽤程序浏览器 APP ⼩程序HTTP通信:客户端发送给服务器的请求信息 服务器返回给客户端的响应信息客户端:前端----->主动请求。

能够发起对应的请求的客户端。

服务端:后端----->被动接受。

1.当⽤户在浏览器的地址栏中输⼊⼀个URL并按回车键后,浏览器会向HTTP服务器发送HTTP请求。

HTTP请求主要分为“Get”和“Post”两种⽅法。

HTTP接口文档

HTTP接口文档

HTTP接口文档接口域名:一、工作方式....................................................................... 错误!未定义书签。

1.1 密码验证方式............................................................................... 错误!未定义书签。

二、字符编码....................................................................... 错误!未定义书签。

三、响应格式....................................................................... 错误!未定义书签。

四、短信发送(单条,多条发送)...................................... 错误!未定义书签。

五、接收状态报告................................................................ 错误!未定义书签。

5.1 主动获取状态............................................................................... 错误!未定义书签。

六、接收上行短信(回复)................................................. 错误!未定义书签。

6.1 主动接收上行短信(回复) ......................................................... 错误!未定义书签。

6.2 推送接收上行短信(回复) ......................................................... 错误!未定义书签。

http接口的调用之json入参及map入参

http接口的调用之json入参及map入参

http接⼝的调⽤之json⼊参及map⼊参1.按照⽂档先写⼊参数,这⾥主要介绍Json格式的String字符串,包括拼接数组String sqr_arry [] = new String[rowList.size()];for(int i = 0; i < rowList.size(); i++) {FieldList field_p = rowList.get(i);//查询每个家庭成员的姓名和⾝份证String xm = field_p.get("pxm");String sfzh = field_p.get("pzjhm");String sq = "{\"xm\":\""+xm+"\",\"sfzh\":\""+sfzh+"\"}";sqr_arry [i] = sq;//把各个家庭对象放进数组}String sqrs = "";for(int i = 0;i < rowList.size(); i++ ){sqrs += sqr_arry [i]+",";//从数组中取对象并做拼接}int idx = stIndexOf(",");//去掉最后⼀个逗号sqrs = sqrs.substring(0,idx);String sqr = "["+sqrs+"]";String pararsa="{\"jkbm\":\"11\",\"batchid\":\""+ID+"\",\"sqrs\":"+sqr+",\"remark\":\""+cxyy+"\"}";//sqr为数组,解析完外层必须不带双引号“”;String urlPost = "http://IP地址:端⼝号/***/***/***.action"; //接⼝地址String resValue = HttpPost(urlPost, pararsa);//请求接⼝/*** 模拟HttpPost请求* @param url* @param jsonString* @return*/public static String HttpPost(String url, String jsonString){CloseableHttpResponse response = null;CloseableHttpClient httpClient = HttpClientBuilder.create().build();//创建CloseableHttpClientHttpPost httpPost = new HttpPost(url);//实现HttpPostRequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(3000).setConnectTimeout(3000).build();httpPost.setConfig(requestConfig); //设置httpPost的状态参数httpPost.addHeader("Content-Type", "application/json");//设置httpPost的请求头中的MIME类型为jsonStringEntity requestEntity = new StringEntity(jsonString, "utf-8");httpPost.setEntity(requestEntity);//设置请求体try {response = httpClient.execute(httpPost, new BasicHttpContext());//执⾏请求返回结果if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {return null;}HttpEntity entity = response.getEntity();if (entity != null) {String resultStr = EntityUtils.toString(entity, "utf-8");return resultStr;} else {return null;}} catch (Exception e) {logger.error("httpPost method exception handle-- > " + e);return null;} finally {if (response != null){try {response.close();//最后关闭response} catch (IOException e) {logger.error("httpPost method IOException handle -- > " + e);}}if(httpClient != null){try {httpClient.close();} catch (IOException e) {logger.error("httpPost method exception handle-- > " + e);}}}}/*** 模拟HttpGet 请求* @param url* @return*/public static String HttpGet(String url){//单位毫秒RequestConfig requestConfig = RequestConfig.custom().setConnectionRequestTimeout(3000).setConnectTimeout(3000).setSocketTimeout(3000).build();//设置请求的状态参数CloseableHttpClient httpclient = HttpClients.createDefault();//创建 CloseableHttpClient HttpGet httpGet = new HttpGet(url);httpGet.setConfig(requestConfig);CloseableHttpResponse response = null;try {response = httpclient.execute(httpGet);//返回请求执⾏结果int statusCode = response.getStatusLine().getStatusCode();//获取返回的状态值if (statusCode != HttpStatus.SC_OK) {return null;} else {String result = EntityUtils.toString(response.getEntity(), "UTF-8");return result;}} catch (Exception e) {logger.error("httpget Exception handle-- > " + e);} finally {if (response != null){try {response.close();//关闭response} catch (IOException e) {logger.error("httpget IOException handle-- > " + e);}}if(httpclient != null){try {httpclient.close();//关闭httpclient} catch (IOException e) {logger.error("httpget IOException handle-- > " + e);}}}return null;}⼯具类HttpUtils ⼊参为mappackage sr.shjz_zt2.util;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.PrintWriter;import java.util.List;import java.util.Map;import net.sf.json.JSONArray;/*** ⽤于模拟HTTP请求中GET/POST⽅式** @author**/public class HttpUtils {/*** 发送GET请求** @param url* ⽬的地址* @param parameters* 请求参数,Map类型。

webservice接口与HTTP接口学习笔记

webservice接口与HTTP接口学习笔记

webservice接⼝与HTTP接⼝学习笔记⼀、webservice 的概念Web 是使应⽤程序可以与平台和编程语⾔⽆关的⽅式进⾏相互通信的⼀项技术。

Web 服务是⼀个软件接⼝,它描述了⼀组可以在⽹络上通过标准化的 XML 消息传递访问的操作。

它使⽤基于 XML 语⾔的协议来描述要执⾏的操作或者要与另⼀个 Web 服务交换的数据。

⼀组以这种⽅式交互的 Web 服务在⾯向服务的体系结构(Service-Oriented Architecture,SOA)中定义了特殊的 Web 服务应⽤程序。

简单的说WebService是⼀个SOA(⾯向服务的编程)的架构,它是不依赖于语⾔,不依赖于平台,可以实现不同的语⾔(通过 xml 描述)间的相互调⽤,通过Internet进⾏基于Http协议的⽹络应⽤间的交互。

通过SOAP在Web上提供的软件服务,使⽤WSDL⽂件进⾏说明,并通过UDDI进⾏注册。

XML:(Extensible Markup Language)扩展型可标记语⾔。

⾯向短期的临时数据处理、⾯向万维⽹络,是Soap的基础。

Soap:(Simple Object Access Protocol)简单对象存取协议。

是XML Web Service 的通信协议。

当⽤户通过UDDI找到你的WSDL描述⽂档后,他通过可以SOAP调⽤你建⽴的Web服务中的⼀个或多个操作。

SOAP是XML⽂档形式的调⽤⽅法的规范,它可以⽀持不同的底层接⼝,像HTTP(S)或者SMTP。

WSDL:(Web Services Description Language) WSDL ⽂件是⼀个 XML ⽂档,⽤于说明⼀组 SOAP 消息以及如何交换这些消息。

⼤多数情况下由软件⾃动⽣成和使⽤。

UDDI (Universal Description, Discovery, and Integration) 是⼀个主要针对Web服务供应商和使⽤者的新项⽬。

HTTP请求和MIME介绍

HTTP请求和MIME介绍

HTTP请求和MIME介绍HTTP请求和MIME介绍HTTP请求由三部分组成,分别是:请求行,消息报头,请求正文。

请求行(格式):Method Request-URI HTTP-Version CRLFMethod:方法。

GET 请求获取由Request-URI所标识的资源。

POST 在Request-URI所标识的资源后附加新的数据。

HEAD 请求获取由Request-URI所标识的资源的响应消息报头。

PUT 请求服务器存储一个资源,并用Request-URI作为其标识。

DELETE 请求服务器删除由Request-URI所标识的资源。

TRACE 请求服务器回送收到的请求信息,主要用语测试或诊断。

CONNECT 保留将来使用。

OPTIONS 请求查询服务器的性能,或查询与资源相关的选项和需求。

Request-URI:统一资源标识。

HTTP-Version:HTTP的版本。

CRLF:回车换行。

(\r\n)例:GET /form.html HTTP/1.1 \r\nHTTP响应在接收和解释请求消息后,服务器会返回一个HTTP响应消息。

与HTTP请求类似,HTTP响应也是三个部分组成,分别是:状态行、消息报头、响应正文。

状态行:状态行由协议版本、数字形式的状态代码、及相应的状态描述,各元素之间以空格分隔。

格式: HTTP-Version Status-Code Reason-Phrase CRLF例如: HTTP/1.1 200 OK \r\n状态代码:状态代码由3位数字组成,表示请求是否被理解或被满足。

状态描述:状态描述给出了关于状态代码的简短的文字描述。

状态代码的第一个数字定义了响应的类别,后面两位没有具体的分类。

第一个数字有五种可能的取值:- 1xx: 指示信息—表示请求已接收,继续处理。

- 2xx: 成功—表示请求已经被成功接收、理解、接受。

- 3xx: 重定向—要完成请求必须进行更进一步的操作。

Http接口调用示例教程

Http接口调用示例教程

Http接⼝调⽤⽰例教程介绍HttpClient库的使⽤前,先介绍jdk⾥HttpURLConnection,因为HttpClient是开源的第三⽅库,使⽤⽅便,不过jdk⾥的都是⽐较基本的,有时候没有HttpClient的时候也可以使⽤jdk⾥的HttpURLConnection,HttpURLConnection都是调jdk 库的,下⾯给出实例代码:import sun.misc.BASE64Encoder;import java.io.*;import .HttpURLConnection;import .URL;import .URLConnection;public class Main {public static void main(String[] args) throws Exception {String url = "https:///ocr_service?app_key=%s";String appKey = "xxxxxx"; // your app_keyString appSecret = "xxxxxx"; // your app_secreturl = String.format(url, appKey);OutputStreamWriter out = null;BufferedReader in = null;String result = "";try {String imgData = imageToBase64("example.jpg");String param="{\"app_secret\":\"%s\",\"image_data\":\"%s\"}";param=String.format(param,appSecret,imgData);URL realUrl = new URL(url);HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection();conn.setRequestProperty("accept", "*/*");conn.setRequestProperty("connection", "Keep-Alive");conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");conn.setDoOutput(true);conn.setDoInput(true);conn.setRequestMethod("POST"); // 设置请求⽅式conn.setRequestProperty("Content-Type", "application/json"); // 设置发送数据的conn.connect();out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");out.append(param);out.flush();out.close();in = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line;while ((line = in.readLine()) != null) {result += line;}} catch (Exception e) {System.out.println("发送 POST 请求出现异常!" + e);e.printStackTrace();}finally {try {if (out != null) {out.close();}if (in != null) {in.close();}} catch (IOException ex) {ex.printStackTrace();}}System.out.println(result);}public static String imageToBase64(String path){String imgFile = path;InputStream in = null;byte[] data = null;try{in = new FileInputStream(imgFile);data = new byte[in.available()];in.read(data);in.close();}catch (IOException e){e.printStackTrace();}BASE64Encoder encoder = new BASE64Encoder();return encoder.encode(data);}}然后介绍⼀下HttpClient,只给出实例代码,不封装成⼯具类,因为理解基本⽤法后,⾃⼰封装⼯具类也是很容易的HttpClient的GET请求CloseableHttpClient httpClient = HttpClients.createDefault();//https:///search?utf8=%E2%9C%93&q=jeeplatform&type=URIBuilder uriBuilder = new URIBuilder("https:///search");uriBuilder.addParameter("q","jeeplatform");HttpGet httpGet = new HttpGet(uriBuilder.build());CloseableHttpResponse httpResponse = httpClient.execute(httpGet);int statusCode = httpResponse.getStatusLine().getStatusCode();if(statusCode==200){HttpEntity entity = httpResponse.getEntity();System.out.println(EntityUtils.toString(entity,"UTF-8"));}httpClient.close();httpResponse.close();HttpClient的POST请求,与GET请求类似CloseableHttpClient httpClient = HttpClients.createDefault();//https:///sie?query=%E8%8A%B1%E5%8D%83%E9%AA%A8&hdq=AQ7CZ&ekv=3&ie=utf8&String uri = "https:///sie";List<NameValuePair> params= new ArrayList<NameValuePair>();params.add(new BasicNameValuePair("query","花千⾻"));StringEntity entity = new UrlEncodedFormEntity(params,"UTF-8");HttpPost httpPost = new HttpPost(uri);httpPost.setEntity(entity);CloseableHttpResponse httpResponse = httpClient.execute(httpPost);int statusCode = httpResponse.getStatusLine().getStatusCode();if(statusCode == 200){System.out.println(EntityUtils.toString(httpResponse.getEntity()));}httpClient.close();httpResponse.close();上⾯例⼦是可以⽀持访问签名要求没那么⾼的接⼝,然后访问⾃签名https的站点,那就要建⽴⼀个⾃定义的SSLContext对象,该对象要有可以存储信任密钥的容器,还要有判断当前连接是否受信任的策略,以及在SSL连接⼯⼚中取消对所有主机名的验证,如果还是使⽤默认的HttpClient是会有下⾯的异常:PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target给出解决⽅法:public static CloseableHttpClient getClient() {RegistryBuilder<ConnectionSocketFactory> registryBuilder = RegistryBuilder.create();ConnectionSocketFactory plainSF = new PlainConnectionSocketFactory();registryBuilder.register("http", plainSF);// 指定信任密钥存储对象和连接套接字⼯⼚try {KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());// 信任任何链接TrustStrategy anyTrustStrategy = new TrustStrategy() {@Overridepublic boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {return true;}};SSLContext sslContext = SSLContexts.custom().useTLS().loadTrustMaterial(trustStore, anyTrustStrategy).build();LayeredConnectionSocketFactory sslSF = new SSLConnectionSocketFactory(sslContext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);registryBuilder.register("https", sslSF);} catch (KeyStoreException e) {throw new RuntimeException(e);} catch (KeyManagementException e) {throw new RuntimeException(e);} catch (NoSuchAlgorithmException e) {throw new RuntimeException(e);}Registry<ConnectionSocketFactory> registry = registryBuilder.build();// 设置连接管理器PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(registry);RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(TIMEOUT_SECONDS * 1000).setConnectTimeout(TIMEOUT_SECONDS * 1000).build();return HttpClientBuilder.create().setConnectionManager(connManager).setMaxConnTotal(POOL_SIZE).setMaxConnPerRoute(POOL_SIZE).setDefaultRequestConfig(requestConfig).build(); }然后CloseableHttpClient httpClient = getClient()就可以然后HttpClient语法相对⽐较繁杂?如果觉得⽐较⿇烦,可以⽤Spring框架的RestTemplate,这⾥要创建⼀个⾃定义的bean,根据需要创建,代码⽰例://访问⾃签名https的要点HttpComponentsClientHttpRequestFactory requestFactory =new HttpComponentsClientHttpRequestFactory(HttpClientUtil.getClient());RestTemplate restTemplate = new RestTemplate(requestFactory);*/Bean result= restTemplate.getForObject(digitalgdOauthUrl, Bean.class);。

http接口文档模板

http接口文档模板

竭诚为您提供优质文档/双击可除http接口文档模板篇一:新http接口说明文档http接口文档接口域名:/api/一、密码验证方式................................................. . (1)二、字符编码................................................. .. (1)三、响应格式................................................. .. (2)四、短信发送(单条,多条发送)............................................... . (2)五、接收状态报告................................................. . (3)5.1主动获取状态................................................. ................................................... (3)六、接收上行短信(回复)............................................... (4)6.1主动接收上行短信(回复)............................................... . (4)七、取剩余短信条数................................................. (5)八、取已发送总条数................................................. (5)九、接口安全(绑定ip)............................................... (6)十、取发送记录................................................. . (6)一、密码验证方式接口密码使用“登录密码”与“用户名”拼接字符串后能过md5加密进行验证如登录密码是:123123如用户名是:test接口密码(pwd)=md5(登录密码+用户名)pwd=md5(123123test)pwd=b9887c5ebb23ebb294acab183ecf0769二、字符编码服务器接收数据可以是gbk或utF-8编码字符,默认接收数据是gbk编码,如提交的是utF-8编码字符,需要添加参数encode=utf8。

http短信接口 (2)

http短信接口 (2)

http短信接口
HTTP短信接口是一种通过HTTP协议发送和接收短信的方式。

它可以实现在互联网上用HTTP通信协议发送短信,并且可以接收短信服务商返回的状态报告。

使用HTTP短信接口发送短信,通常需要提供以下参数:
1. 请求URL:短信服务商提供的API接口地址。

2. 账号和密码:短信服务商提供的账号和密码,用于进行身份验证。

3. 手机号码:短信的接收者手机号码。

4. 短信内容:需要发送的短信内容。

发送短信时,需要将以上参数以指定的格式组装成HTTP 请求,发送到短信服务商的接口地址。

短信服务商接收到请求后,会根据提供的账号和密码进行身份验证,并将短
信内容发送给指定的手机号码。

发送成功后,短信服务商会返回一个接口响应,通知发送结果。

需要注意的是,不同的短信服务商可能有不同的HTTP请求参数和参数格式,具体使用方法需要参考短信服务商提供的接口文档或示例代码。

http接口原理

http接口原理

http接口原理HTTP接口是一种基于网络协议的通信方式,它是基于客户端-服务器模型的,客户端通过发送HTTP请求访问服务器上的资源,服务器则根据请求返回相应的数据。

HTTP是基于TCP/IP协议的应用层协议,它使用可靠的、面向连接的传输层协议进行通信。

客户端与服务器之间通过建立TCP连接来传输HTTP请求和响应。

HTTP请求由请求行、请求头和请求体组成。

请求行包含请求方法(GET、POST等)、URL和协议版本;请求头包含一些附加的请求信息,如用户代理、内容类型等;请求体包含实际的请求内容,比如表单数据、JSON数据等。

服务器收到HTTP请求后,根据请求的URL确定要访问的资源,并进行相应的处理。

处理后,服务器返回HTTP响应给客户端,响应由响应行、响应头和响应体组成。

响应行包含协议版本、状态码和描述;响应头包含响应的一些附加信息,如内容类型、长度等;响应体包含实际的响应内容,比如HTML页面、JSON数据等。

HTTP的请求方法有多种,最常用的是GET和POST。

GET方法用于获取资源,通过URL传递参数,请求是幂等的,即多次请求结果相同;POST方法用于提交数据,请求参数包含在请求体中,请求是非幂等的,即多次请求结果不同。

HTTP还支持其他的请求方法,如PUT、DELETE、HEAD等,用于更新资源、删除资源、获取资源头信息等。

HTTP接口通常使用REST(Representational State Transfer)风格来设计,它将资源抽象为URL,通过不同的请求方法对资源进行操作。

RESTful API是一种符合REST原则的HTTP 接口设计。

HTTP接口的实现通常是通过Web服务器来实现的,如Apache、Nginx等。

Web服务器接收到HTTP请求后,会将请求转发给应用程序,应用程序处理请求后再将响应返回给Web服务器,最后由Web服务器将响应发送给客户端。

http协议接口

http协议接口

http协议接口HTTP协议接口。

HTTP(Hypertext Transfer Protocol)是一种用于传输超文本的应用层协议,它是全球互联网最重要的协议之一。

HTTP协议接口指的是通过HTTP协议进行通信的接口,它是各种网络应用程序的基础。

本文将介绍HTTP协议接口的基本原理、使用方法和相关注意事项。

一、基本原理。

HTTP协议接口是通过客户端和服务器之间的请求-响应模式进行通信的。

客户端发送HTTP请求到服务器,服务器接收到请求后进行处理并返回HTTP响应给客户端。

HTTP协议接口的基本原理可以简单概括为,客户端发起请求,服务器响应请求。

二、使用方法。

1. 发起HTTP请求。

客户端通过各种网络应用程序(如浏览器、移动应用等)发起HTTP请求。

HTTP请求由请求行、请求头部、空行和请求数据四部分组成。

请求行包括请求方法(如GET、POST等)、请求的URL和协议版本;请求头部包括各种请求参数和信息;空行用于分隔请求头部和请求数据;请求数据可以是表单数据、上传文件等。

2. 处理HTTP请求。

服务器接收到HTTP请求后,根据请求的URL和参数进行相应的处理。

处理过程可能包括读取数据库、调用其他服务接口、生成动态内容等。

服务器处理完成后,将生成的HTTP响应返回给客户端。

3. 返回HTTP响应。

HTTP响应由状态行、响应头部、空行和响应数据四部分组成。

状态行包括协议版本、状态码和状态消息;响应头部包括各种响应参数和信息;空行用于分隔响应头部和响应数据;响应数据可以是HTML页面、JSON数据等。

三、相关注意事项。

1. 安全性。

在使用HTTP协议接口时,需要注意数据的安全性。

特别是在传输用户敏感信息(如用户名、密码等)时,应当使用HTTPS协议进行加密传输,以防止信息被窃取。

2. 性能优化。

对于频繁访问的接口,可以通过缓存、负载均衡、CDN等手段进行性能优化,提高接口的响应速度和稳定性。

3. 异常处理。

HTTP的长连接和短连接详解(HTTP请求头中的Connection字段)HTTP响应头中。。。

HTTP的长连接和短连接详解(HTTP请求头中的Connection字段)HTTP响应头中。。。

HTTP的长连接和短连接详解(HTTP请求头中的Connection字段)HTTP响应头中。

HTTP的长连接和短连接详解(HTTP 请求头中的Connection字段)前⾔:HTTP的长连接和短连接本质上是TCP的长连接和短连接。

HTTP属于应⽤层协议,在传输层使⽤TCP协议,在⽹络层使⽤IP协议。

IP协议主要解决⽹络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠地传递数据包,使得⽹络上接收端收到发送端所发出的所有包,并且顺序与发送顺序⼀致。

TCP协议是可靠的、⾯向连接的。

当客户端浏览器访问的某个HTML或其他类型的Web页中包含有其他的Web资源(如JavaScript⽂件、图像⽂件、CSS⽂件等),每遇到这样⼀个Web资源,浏览器就会重新建⽴⼀个HTTP会话。

【例如获取某⼀页⾯的某⼀资源后还想要获取同⼀页⾯的其他资源时,但是此时TCP连接已经关闭,所以需要重新TCP连接,然后才可以请求和响应。

】⽽从HTTP/1.1起,默认使⽤长连接,⽤以保持连接特性。

使⽤长连接的HTTP协议,会在响应头加⼊这⾏代码:Connection:keep-alive在使⽤长连接的情况下,当⼀个⽹页打开完成后,客户端和服务器之间⽤于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使⽤这⼀条已经建⽴的连接。

Keep-Alive不会永久保持连接,它有⼀个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。

实现长连接需要客户端和服务端都⽀持长连接。

原理:HTTP协议既可以实现长连接,也可以实现短连接。

在HTTP/1.0中,默认使⽤的是短连接。

也就是说,浏览器和服务器每进⾏⼀次HTTP操作,就建⽴⼀次连接,但任务结束就中断连接。

如果客户端访问的某个HTML或其他类型的web页中包含有其他的web资源,如JavaScript⽂件、图像⽂件、CSS⽂件等,当浏览器每遇到这样⼀个web资源,就会建⽴⼀个HTTP会话。

【HTTP协议】---HTTP协议详解

【HTTP协议】---HTTP协议详解

【HTTP协议】---HTTP协议详解HTTP协议详解⼀.HTTP简介1.HTTP协议,即超⽂本传输协议(Hypertext transfer protocol)。

是⼀种详细规定了浏览器和万维⽹(WWW = World Wide Web)服务器之间互相通信的规则,通过因特⽹传送万维⽹⽂档的数据传送协议。

2.HTTP协议作为TCP/IP模型中应⽤层的协议也不例外。

HTTP协议通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了我们常说的HTTPS。

如下图:3.HTTP是⼀个应⽤层协议,由请求和响应构成,是⼀个标准的客户端服务器模型。

HTTP是⼀个⽆状态的协议。

4.HTTP默认的端⼝号为80,HTTPS的端⼝号为443。

5.浏览⽹页是HTTP的主要应⽤,但是这并不代表HTTP就只能应⽤于⽹页的浏览。

HTTP是⼀种协议,只要通信的双⽅都遵守这个协议,HTTP就能有⽤武之地。

⽐如咱们常⽤的QQ,迅雷这些软件,都会使⽤HTTP协议(还包括其他的协议)。

⼆.HTTP特点1、简单快速:客户向服务器请求服务时,只需传送请求⽅法和路径。

由于HTTP协议简单,使得HTTP服务器的程序规模⼩,因⽽通信速度很快。

2、灵活:HTTP允许传输任意类型的数据对象。

正在传输的类型由Content-Type加以标记。

3、HTTP 0.9和1.0使⽤⾮持续连接:限制每次连接只处理⼀个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接。

HTTP 1.1使⽤持续连接:不必为每个web对象创建⼀个新的连接,⼀个连接可以传送多个对象,采⽤这种⽅式可以节省传输时间。

4、⽆状态:HTTP协议是⽆状态协议。

⽆状态是指协议对于事务处理没有记忆能⼒。

缺少状态意味着如果后续处理需要前⾯的信息,则它必须重传,这样可能导致每次连接传送的数据量增⼤。

另⼀⽅⾯,在服务器不需要先前信息时它的应答就较快。

5、⽀持B/S及C/S模式。

HTTP常用端口号与对应的服务说明

HTTP常用端口号与对应的服务说明

HTTP常⽤端⼝号与对应的服务说明常⽤端⼝号与对应的服务以及端⼝关闭端⼝简介:本⽂介绍端⼝的概念,分类,以及如何关闭/开启⼀个端⼝ 21端⼝:21端⼝主要⽤于FTP(File Transfer Protocol,⽂件传输协议)服务。

23端⼝:23端⼝主要⽤于Telnet(远程登录)服务,是Internet上普遍采⽤的登录和仿真程序。

25端⼝:25端⼝为SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)服务器所开放,主要⽤于发送邮件,如今绝⼤多数邮件服务器都使⽤该协议。

53端⼝:53端⼝为DNS(Domain Name Server,域名服务器)服务器所开放,主要⽤于域名解析,DNS服务在NT系统中使⽤的最为⼴泛。

67、68端⼝:67、68端⼝分别是为Bootp服务的Bootstrap Protocol Server(引导程序协议服务端)和Bootstrap Protocol Client(引导程序协议客户端)开放的端⼝。

69端⼝:TFTP是Cisco公司开发的⼀个简单⽂件传输协议,类似于FTP。

79端⼝:79端⼝是为Finger服务开放的,主要⽤于查询远程主机在线⽤户、操作系统类型以及是否缓冲区溢出等⽤户的详细信息。

80端⼝:80端⼝是为HTTP(HyperText Transport Protocol,超⽂本传输协议)开放的,这是上⽹冲浪使⽤最多的协议,主要⽤于在WWW(World Wide Web,万维⽹)服务上传输信息的协议。

99端⼝:99端⼝是⽤于⼀个名为"Metagram Relay"(亚对策延时)的服务,该服务⽐较少见,⼀般是⽤不到的。

109、110端⼝:109端⼝是为POP2(Post Office Protocol Version 2,邮局协议2)服务开放的,110端⼝是为POP3(邮件协议3)服务开放的,POP2、POP3都是主要⽤于接收邮件的。

http流程

http流程

http流程HTTP(Hypertext Transfer Protocol)是一种用于传输超文本的应用层协议,它是全球互联网的基础之一。

在互联网上,HTTP被用来传输各种类型的数据,包括HTML网页、图片、音频、视频等。

本文将介绍HTTP的基本流程,包括请求和响应的过程,以及一些常见的状态码和头部字段。

HTTP的基本流程可以分为请求和响应两个阶段。

在请求阶段,客户端向服务器发送一个HTTP请求,请求的内容可以包括要访问的资源的URL、请求方法(GET、POST等)、请求头部字段等。

服务器在接收到请求后,会根据请求的内容来处理,并生成一个HTTP响应返回给客户端。

在HTTP请求中,URL是一个非常重要的部分,它指定了客户端要访问的资源的地址。

请求方法则指定了客户端对资源的操作,比如GET方法用于请求获取资源,POST方法用于提交数据等。

请求头部字段包括了一些额外的信息,比如客户端的身份标识、所接受的数据类型等。

在服务器接收到请求后,会根据请求的内容来处理,并生成一个HTTP响应返回给客户端。

HTTP响应包括了一个状态行、响应头部字段和响应体。

状态行包括了一个状态码和状态消息,状态码用于表示服务器对请求的处理结果,比如200表示成功,404表示未找到资源等。

响应头部字段包括了一些额外的信息,比如服务器的类型、响应的数据类型等。

响应体则包括了实际的响应数据,比如HTML网页的内容、图片的二进制数据等。

除了基本的请求和响应过程,HTTP还定义了一些常见的状态码和头部字段。

状态码用于表示服务器对请求的处理结果,比如200表示成功,404表示未找到资源,500表示服务器内部错误等。

头部字段包括了一些额外的信息,比如Content-Type用于指定响应的数据类型,Content-Length用于指定响应数据的长度等。

总的来说,HTTP的流程非常简单明了,客户端向服务器发送一个请求,服务器处理请求并返回一个响应。

HTTP协议

HTTP协议

HTTP协议协议名称:HTTP协议一、引言HTTP(Hypertext Transfer Protocol)是一种应用层协议,用于在客户端和服务器之间传输超文本数据。

它是互联网上最常用的协议之一,被广泛应用于万维网(World Wide Web)中。

二、目的本协议的目的是规定HTTP通信的标准格式,确保客户端和服务器之间的数据传输顺利进行。

通过遵循本协议,可以实现信息的快速、准确和可靠的传输。

三、范围本协议适合于所有使用HTTP协议进行通信的客户端和服务器。

四、术语定义1. 客户端:发起HTTP请求的设备或者应用程序。

2. 服务器:接收并处理HTTP请求的设备或者应用程序。

3. 请求:客户端向服务器发起的数据传输请求。

4. 响应:服务器对客户端请求的回应数据。

五、协议规范1. 请求格式客户端向服务器发送请求时,应按照以下格式构造HTTP请求:```<方法> <URL> <协议版本><请求头部字段1>: <值1><请求头部字段2>: <值2>...<请求头部字段N>: <值N><请求正文>```- 方法:指定请求的类型,常见的方法有GET、POST、PUT、DELETE等。

- URL:请求的目标资源的地址。

- 协议版本:HTTP协议的版本号,如HTTP/1.1。

- 请求头部字段:附加的请求信息,如User-Agent、Content-Type等。

- 请求正文:可选,包含请求的数据。

2. 响应格式服务器对客户端请求的回应应按照以下格式构造HTTP响应:```<协议版本> <状态码> <状态码描述><响应头部字段1>: <值1><响应头部字段2>: <值2>...<响应头部字段N>: <值N><响应正文>```- 协议版本:HTTP协议的版本号,如HTTP/1.1。

Http接口安全整理

Http接口安全整理

Http接⼝安全整理1.Http接⼝安全概述:1.1、Http接⼝是互联⽹各系统之间对接的重要⽅式之⼀,使⽤http接⼝,开发和调⽤都很⽅便,也是被⼤量采⽤的⽅式,它可以让不同系统之间实现数据的交换和共享,但由于http接⼝开放在互联⽹上,那么我们就需要有⼀定的安全措施来保证不能是随随便便就可以调⽤;1.2、⽬前国内互联⽹公司主要采⽤两种做法实现接⼝的安全:⼀种是以⽀付宝等⽀付公司为代表的私钥公钥签名验证机制;⼀种是⼤量互联⽹企业都常采⽤的参数签名验证机制;2. Http接⼝安全演进:2.1.完全开放的接⼝(完全开放)2.2.接⼝参数签名(基本安全)2.3.接⼝参数签名+时效性验证(更加安全)2.4.接⼝参数私钥签名公钥验签(固若⾦汤)2.5.接⼝参数签名+Https(⾦钟罩)2.6.⼝参数私钥签名公钥验签+Https(⾦钟罩)总之:安全是相对的,只有相对的安全,没有绝对的安全!3.Http接⼝安全设计及应⽤3.1 接⼝参数私钥签名公钥验签先来看看私钥+公钥的安全模式,这是⼀种更为安全的⽅式,它通过私钥和公钥实现接⼝的安全,⽬前互联⽹中主要是以⽀付宝为代表的公司采⽤这种机制;(有很多开放平台也是采⽤这种机制) . 具体业务流所⽰:该签名是通过4个秘钥来实现的,分别是:客户端应⽤私钥 , 客户端公钥 , 服务端应⽤私钥 , 服务端公钥.私钥都是⽤来⽣成签名的,公钥都是⽤来解密的,客户端的公钥解密客户端的私钥⽣成的签名,服务端的公钥解密服务端的私钥⽣成的签名,相信这样解释应该会⽐较好理解的.好了,下⾯就来看看是如何具体操作的,我的具体操作步骤:介绍⼀下这个⼯具吧,OpenSSL 是⼀个开源的安全套接字层密码库,囊括主要的密码算法、常⽤的密钥和证书封装管理功能及SSL协议,并提供丰富的应⽤程序测试或其它⽬的使⽤;OpenSSL整个软件包⼤概可以分成三个主要的功能部分:SSL协议库、应⽤程序以及密码算法库;3.1.1确保Linux已经安装openssl :使⽤命令检查Linux是否已经安装openssl:yum list installed | grep openssl如果没有安装,则执⾏命令进⾏安装:yum install openssl openssl-devel -y3.1.2创建秘钥⽣成的⽬的地(⽂件夹):ps : 我是在根⽬录中的soft⽂件夹下创建的mkdir server , mkdir client 先创建这两个⽂件,然后Linux会默认将⽣成的秘钥放⼊其中.3.1.3 ⽣成秘钥进⼊server⽂件,输⼊openssl 进⼊Openssl命令⾏;使⽤openssl⽣成私钥,执⾏如下命令:genrsa -out rsa_private_key.pem 2048注意⼀点Java开发者需要将私钥转换成PKCS8格式,其他语⾔不⽤这⼀步操作,执⾏如下命令:pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out rsa_private_key_pkcs8.pem使⽤openssl⽣成公钥,执⾏如下命令:rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem退出openssl命令⾏:exit经过以上步骤,我们可以在当前⽬录中(server)看到三个⽂件:rsa_private_key.pem(RSA私钥)rsa_private_key_pkcs8.pem(pkcs8格式RSA私钥)(我们java要使⽤的私钥是这⼀个)rsa_public_key.pem(对应RSA公钥)client端的秘钥与server端的秘钥⽣成⼀样,这⾥就不叙述了,想体验的朋友⾃⼰按照上⼀步操作再做⼀遍即可.3.2 Demo好了,现在就可以使⽤⽣成的秘钥来做⼀个简单的Demo来检验⼀下了.⾸先这⾥提供⼀个签名处理⼯具类:说明:该⼯具类依赖的包是java.security,该包JDK8才有,所以,如果使⽤下⾯这个Demo的话,建议检查⾃⼰的JDK是不是JDK8,如果是JDK8以下的版本,以下的Demo是⽤不了的.解决⽅法就是,使⽤第三⽅提供的依赖包,效果是相同的,依赖包如下:<dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>RELEASE</version></dependency>以下是签名⼯具类:package com.kinglong.http.utils;import java.security.KeyFactory;import java.security.PublicKey;import java.security.Signature;import java.security.interfaces.RSAPrivateKey;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import java.util.Base64;/*** 签名处理⼯具类** @author haojinlong**/public class MyRSAUtils {public static final String CHARSET = "utf-8";/*** RSA私钥签名** @param src 客户端传过来的原始参数* @param priKey 我们的客户端私钥* @return* @throws Exception*/public static String sign (String src, String priKey) {try {KeyFactory fac = KeyFactory.getInstance("RSA");byte[] pribyte = Base64.getDecoder().decode(priKey);PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(pribyte); RSAPrivateKey privateKey = (RSAPrivateKey) fac.generatePrivate(keySpec);Signature sigEng = Signature.getInstance("SHA1withRSA");sigEng.initSign(privateKey);sigEng.update(src.getBytes(MyRSAUtils.CHARSET));byte[] signature = sigEng.sign();return Base64.getEncoder().encodeToString(signature);} catch (Exception e) {e.printStackTrace();}return null;}/*** RSA公钥验证签名** @param src 客户端穿过来的原始数据* @param sign 签名* @param publicKey 我们的客户端公钥* @return*/public static boolean signVerify (String sign, String src, String publicKey) {try {KeyFactory keyFactory = KeyFactory.getInstance("RSA");//将公钥变为⼀个字节数组byte[] encodedKey = Base64.getDecoder().decode(publicKey);//使⽤秘钥⼯⼚⽣成⼀个公钥对象pubKeyPublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey)); //使⽤"SHA1WithRSA"算法,⽣成签名对象signatureSignature signature = Signature.getInstance("SHA1WithRSA");signature.initVerify(pubKey);signature.update(src.getBytes(MyRSAUtils.CHARSET));boolean bverify = signature.verify(Base64.getDecoder().decode(sign));return bverify;} catch (Exception e) {e.printStackTrace();}return false;}}下⾯是签名时需要的辅助⼯具类:package com.kinglong.http.HttpUtils;import java.util.Iterator;import java.util.Map;import java.util.Set;import java.util.TreeMap;/***⽣成签名需要的辅助⼯具类*/public class SignUtils {/***将传进来的⽆序参数,转换为有序的字符串输出*/public static String generateSortSign(Map<String,Object>paramMap){Map<String,Object> treeMap = new TreeMap<String, Object>(paramMap);Set<Map.Entry<String,Object>> entrySet = treeMap.entrySet();Iterator<Map.Entry<String,Object>> iterator = entrySet.iterator();StringBuffer stringBuffer = new StringBuffer();while (iterator.hasNext()){Map.Entry<String,Object> entry=iterator.next();String keys = entry.getKey();String value = (String) entry.getValue();stringBuffer.append(keys).append(value);}return stringBuffer.toString();}}客户端代码:package com.kinglong.http.controller;import com.alibaba.fastjson.JSONObject;import com.kinglong.http.HttpUtils.HttpClientUtils;import com.kinglong.http.HttpUtils.SignUtils;import com.kinglong.http.constans.Constans;import com.kinglong.http.utils.MyRSAUtils;import java.util.Date;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;public class HttpClient {public static void main(String[] args) {demo();}public static void demo(){String url ="http://localhost:8080/api/verifydemo";//这⾥仅做演⽰使⽤,所以随⼿写了⼏个信息String realName = "我是验证信息";String phone = "17000000000";String idCard = "6403021992120511111";String bankCard = "5555555555555555555555";//封装参数Map<String,Object> paramMap = new ConcurrentHashMap<String, Object>();paramMap.put("realName",realName);paramMap.put("phone",phone);paramMap.put("idCard",idCard);paramMap.put("bankCard",bankCard);//⽣成客户端签名,注意看,客户端这⾥⽣成签名的时候是使⽤的客户端私钥Constans.CLIENT_PRIVATE_KEYString sign = MyRSAUtils.sign(SignUtils.generateSortSign(paramMap),Constans.CLIENT_PRIVATE_KEY);paramMap.put("sign",sign);//发送请求时注意:因为肯定会不可避免的要输出中⽂字符,所以记得在使⽤HttpClient通信的时候,设置编码格式为utf-8//否则,我想你的签名验证成功的概率基本等于让两条平⾏线相交成功的概率String json = HttpClientUtils.doPostByEncode(url,paramMap,"utf-8");//解析json字符串JSONObject jsonObject = JSONObject.parseObject(json);String code = jsonObject.getString("code");String erroMessage = jsonObject.getString("erroMessage");JSONObject object = jsonObject.getJSONObject("object");String result = object.getString("result");String ret_sign = object.getString("ret_sign");//服务端发回的签名String resultDesc = object.getString("resultDesc");//封装参数准备进⾏验证该返回信息是否是由服务端发回的//验证时的参数可以根据⾃⼰公司的规范去选择,我这⾥就选了这两个参数,因为偷懒没有⽣成新的map,所以这⾥需要clear⼀下. paramMap.clear();paramMap.put("result",result);paramMap.put("resultDesc",resultDesc);//调⽤签名验证⼯具类进⾏签名验证//重点敲⿊板啦!!注意看,这⾥使⽤的是服务端的公钥来解密服务端发送的签名的,很多⼈肯定使⽤了客户端公钥来解密,必然是失败的//同理,在服务端要是⽤客户端的公钥解密客户端发送的签名,这个前⾯的流程图我觉得已经说得很明确了boolean isTrue = MyRSAUtils.signVerify(ret_sign,SignUtils.generateSortSign(paramMap),Constans.SERVER_PUBLIC_KEY);if (isTrue){System.out.println("返回正确信息,可以进⾏下⼀步操作");}else {System.out.println("返回错误信息,不可以进⾏下⼀步操作");}}}下⾯是客户端使⽤的公共常量类:package com.kinglong.http.constans;public class Constans {//客户端私钥public static final StringCLIENT_PRIVATE_KEY="MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQClEAp0NDHtb9w5iJfyNOh6DeCRv0RjGFA1CIQ6ZxpfIc65h03hUGsDjcZtWQQZf7d30hiVCcQLylJYJidH //服务端公钥public static final StringSERVER_PUBLIC_KEY="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqlG1v814kyQIEpLQnyxo/4RUku8PE+csGzH073XoW8xPdXAH8C7Y3isyDKSClTEGeS/SaqioYPFI+YlD0Eag1D }ok,客户端就齐活了,下⾯是服务端:服务端使⽤的是springboot框架,以下是pom⽂件说明:服务端的签名⽣成类,签名⽣成的辅助类都与客户端相同,所以,这⾥就不写了.服务端的公共常量类:package com.kinglong.http.constans;public class Constans {//服务端私钥public static final StringSERVER_PRIVATE_KEY="MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCqUbW/zXiTJAgSktCfLGj/hFSS7w8T5ywbMfTvdehbzE91cAfwLtjeKzIMpIKVMQZ5L9JqqKhg8Uj5iUP //客户端公钥public static final StringCLIENT_PUBLIC_KEY="MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApRAKdDQx7W/cOYiX8jToeg3gkb9EYxhQNQiEOmcaXyHOuYdN4VBrA43GbVkEGX+3d9IYlQnEC8pSWCYnR0 }服务端接⼝:package com.kinglong.http.controller;import com.kinglong.http.constans.Constans;import com.kinglong.http.rto.ResponseObject;import com.kinglong.http.utils.MyRSAUtils;import com.kinglong.http.utils.SignUtils;import ng.StringUtils;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.ResponseBody;import java.util.Date;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;@Controllerpublic class HttpController {@RequestMapping("/api/verifydemo")@ResponseBodypublic Object demo(@RequestParam(value = "realName")String realName,@RequestParam(value = "phone")String phone,@RequestParam(value = "idCard")String idCard,@RequestParam(value = "bankCard")String bankCard,@RequestParam(value = "sign")String sign){ResponseObject responseObject = new ResponseObject();Map<String,Object> map = new ConcurrentHashMap<String,Object>();//签名参数验证if (StringUtils.isEmpty(realName)){responseObject.setErroMessage("真实姓名不能为空");responseObject.setCode("0000");}else if (StringUtils.isEmpty(phone)){responseObject.setErroMessage("⼿机号不能为空");responseObject.setCode("0000");}else if (StringUtils.isEmpty(idCard)){responseObject.setErroMessage("⾝份证不能为空");responseObject.setCode("0000");}else if (StringUtils.isEmpty(bankCard)){responseObject.setErroMessage("银⾏卡不能为空");responseObject.setCode("0000");}else if (StringUtils.isEmpty(sign)){responseObject.setErroMessage("签名不能为空");responseObject.setCode("0000");}else {//封装参数进⾏验证map.put("realName",realName);map.put("phone",phone);map.put("idCard",idCard);map.put("bankCard",bankCard);//注意看,这⾥使⽤的就是客户端的公钥进⾏签名的解密boolean isTrue = MyRSAUtils.signVerify(sign,SignUtils.generateSortSign(map),Constans.CLIENT_PUBLIC_KEY);if (!isTrue){responseObject.setErroMessage("签名有误,请核查后再次尝试");responseObject.setCode("0000");}}//0000是失败,1111是成功String code = responseObject.getCode();if(code!=null && code.equals("0000")){map.clear();map.put("result","0000");map.put("resultDesc",responseObject.getErroMessage());//使⽤服务端私钥⽣成返回的签名String ret_sign = MyRSAUtils.sign(SignUtils.generateSortSign(map),Constans.SERVER_PRIVATE_KEY);map.put("ret_sign",ret_sign);responseObject.setObject(map);}else {map.clear();map.put("result","ok");map.put("resultDesc","验证通过");//使⽤服务端私钥⽣成返回的签名String ret_sign = MyRSAUtils.sign(SignUtils.generateSortSign(map),Constans.SERVER_PRIVATE_KEY);map.put("ret_sign",ret_sign);responseObject.setObject(map);responseObject.setCode("1111");responseObject.setErroMessage("验证成功");}return responseObject;}}over,以上就是使⽤私钥+公钥进⾏http接⼝安全设计的简单上⼿⽰例.个⼈觉得,能把这个私钥公钥的搞明⽩了,其他的⼏个接⼝安全设计也就不在话下了,基本看⼀下流程图就能了然于⼼了.这⾥就放出参数安全设计的流程图,具体代码就不写了,有兴趣的可以尝试着做⼀下.为了⽅便练习的盆友快速理解,那就顺带提⼏个需要注意的点吧.在做:"接⼝参数签名+时效性验证(更加安全)"时,注意服务端返回的签名就不需要再传时间戳了,理应是要传的,但是⼀般很少有⼈这么做.不过,要不要这么做,也得看公司的要求嘛.在拼装秘钥的时候,注意字符串⾸先得进⾏排序,不管是升序还是降序,亦或是其他的顺序(⽐如公司要求的顺序),如果不先按照⼀个约定的顺序进⾏排序,那么势必会造成客户端与服务端参数的字符串排列顺序不同,致使⽆法验证成功.这⾥就提供⼀个简便的排序⼯具,并且使⽤MD5进⾏16进制加密。

SpringBoot(1)HTTP接口请求

SpringBoot(1)HTTP接口请求

SpringBoot(1)HTTP接⼝请求⼀、HTTP请求配置讲解简介:SpringBoot2.x HTTP请求注解讲解和简化注解配置技巧1、@RestController和@RequestMapping是springMVC的注解,不是springboot特有的2、@RestController=@Controller+@ResponseBody3、@SpringBootApplication=@Configuration+@EnableAutoConfiguration+@ComponentScan⼆、接⼝⼯具PostMan⽤于接⼝调试基本功能,如图左侧功能栏:History为近期的测试脚本历史记录;Collections为以postman官⽹API为例的脚本实例,也可以新建⽂件夹,⽤于放置不同测试脚本的⽂件集合;主界⾯:可以选择HTTP请求的⽅法,填写URL、参数,cookie管理、脚本保存&另存为等功能。

三、HTTP接⼝GET请求1//测试http协议的get请求2 @RestController3public class GetController {45private Map<String,Object> params = new HashMap<>();67/**8 * 功能描述:测试restful协议,从路径中获取字段9 * @param cityId10 * @param userId11 * @return12 * 注意:传递参数都⽤⼩写13 *14 * 前端:localhost:8080/100/2015*/16 @RequestMapping(path = "/{city_id}/{user_id}", method = RequestMethod.GET)17public Object findUser(@PathVariable("city_id") String cityId,18 @PathVariable("user_id") String userId ){19 params.clear();2021 params.put("cityId", cityId);22 params.put("userId", userId);2324return params;2526 }2728/**29 * 功能描述:测试GetMapping30 * @param from31 * @param size32 * @return33 *34 * 前端:localhost:8080/v1/page_user1?from=0&size=1035*/36 @GetMapping(value="/v1/page_user1")37public Object pageUser(int from, int size ){38 params.clear();3940 params.put("from", from);41 params.put("size", size);4243return params;4445 }4647/**48 * 功能描述:默认值,是否必须的参数49 * @param from50 * @param size51 * @return52*/53 @GetMapping(value="/v1/page_user2")54public Object pageUserV2(@RequestParam(defaultValue="0",name="page") int from, int size ){ 5556 params.clear();57 params.put("from", from);58 params.put("size", size);5960return params;6162 }636465/**66 * 功能描述:bean对象传参67 * 注意:1、注意需要指定http头为 content-type为application/json68 * 2、使⽤body传输数据69 * @param user70 * @return71*/72 @RequestMapping("/v1/save_user")73public Object saveUser(@RequestBody User user){74 params.clear();75 params.put("user", user);76return params;77 }7879/**80 * 功能描述:测试获取http头信息81 * @param accessToken82 * @param id83 * @return84*/85 @GetMapping("/v1/get_header")86public Object getHeader(@RequestHeader("access_token") String accessToken, String id){87 params.clear();88 params.put("access_token", accessToken);89 params.put("id", id);90return params;91 }9293 @GetMapping("/v1/test_request")94public Object testRequest(HttpServletRequest request){95 params.clear();96 String id = request.getParameter("id");97 params.put("id", id);98return params;99 }100101 }四、HTTP接⼝POST,PUT,DELETE请求1//测试http协议的post,del,put请求2 @RestController3public class OtherHttpController {45private Map<String,Object> params = new HashMap<>();67/**8 * 功能描述:测试PostMapping9 * @param accessToken10 * @param id11 * @return12*/13 @PostMapping("/v1/login")14public Object login(String id, String pwd){15 params.clear();16 params.put("id", id);17 params.put("pwd", pwd);18return params;19 }2021 @PutMapping("/v1/put")22public Object put(String id){23 params.clear();24 params.put("id", id);25return params;26 }2728 @DeleteMapping("/v1/del")29public Object del(String id){30 params.clear();31 params.put("id", id);32return params;33 }3435 }。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、查询菜品列表接口(DONE)
1、功能说明
接受提供的菜品
XXX画面XXX功能(比如人口查询画面-查询| 人口查询画面-详细等)2、接口调用说明
2.1获取地址
2.2http请求方式
GET
2.3数据返回格式
JSON
2.4传递参数
2.5成功返回结果
[
“serverResponse”:”Success”,
“totalRecords”:”52”,
“page” : “10”,
“pageSize” : “5”,
“data”:{
“id” : “123”,
“itemName” : “皇堡”,
“priceNow” : “10”,
“pricePast” : “12”,
“servicePicture” :”s9118668.jpg”,
“serviceStars” : “3”
},
…….
{
“id” : “”,
“itemName” : “”,
“priceNow” : “”,
“pricePast” : “”,
“servicePicture” :” s9118668.jpg”,
“serviceStars” : “3”
}
]
2.6返回结果解释
二、查询广告接口(DONE)
1、功能说明
接受广告图片,目前为一张
2、接口调用说明
2.1获取地址
2.2http请求方式
GET
2.3数据返回格式
JSON
2.4传递参数
2.5成功返回结果
{
"serverResponse":"Success",
“advertisePicture” : “0f736a68b929b0955b319ebc41336.jpg”}
2.6返回结果解释
三、查询订单列表接口(DONE)
1、功能说明
根据指定的客户id查询订单
2、接口调用说明
2.1获取地址
2.2http请求方式
GET
2.3数据返回格式
JSON
2.4传递参数
参数说明
这个接口可以作为多种用途:
搜索正在进行中的订单:customerID和orderStatus 2.5成功返回结果
{
"serverResponse":"Success",
“data”:[
{
“orderNo” : “02135”
“orderTime” : “11:00”,
“orderStatus” : “评价完毕”,
“paidAmount” : “30”
}
……
]
}
2.6返回结果解释。

相关文档
最新文档