网站服务器证书有问题/长尾关键词挖掘精灵官网
http报文格式
知识点了解:之前已写到过,http报文格式如下:
报文首部(第一行为请求方法 请求uri http版本 或者http版本 响应状态码)
空行
报文主体(就是请求体body)
有了上述概念之后就可以实现自己来解析http报文了。
首部字段类型
General Header Fields
Request Header Fields(发送http请求时用到)
Response Header Fields (响应http报文中用到)
Entity Header Fields
http/1.1中规定了47种首部字段,不需要都记住,了解然后知道去查就ok了。
通用首部字段 | 作用 |
---|---|
Date | 报文创建的时间 |
Via | 代理信息 |
Upgrade | 升级为其他协议 |
Cache-Control | 控制缓存行为 |
其他请求,响应中用到了更丰富的字段,http/1.1官方解读查询。
除此之外,在开发过程中可以进行header的自定义。
现在进入正题,解析http报文,java代码如下
package HTTPParser;import HTTPParser.httpMsgParser.HttpMsgParser;import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;/*** @author liubh* @date 2020/1/2 16:58* @email*/
public class HTTPReceivedMsg implements HttpMsgParser<HTTPReceivedMsg> {private String httpMsg;private Map HeaderMsg;private byte[] requestBody;public String getHttpMsg() {return httpMsg;}public void setHttpMsg(String httpMsg) {this.httpMsg = httpMsg;}public Map getHeaderMsg() {return HeaderMsg;}public void setHeaderMsg(Map headerMsg) {HeaderMsg = headerMsg;}public byte[] getRequestBody() {return requestBody;}public void setRequestBody(byte[] requestBody) {this.requestBody = requestBody;}@Overridepublic String toString() {return "HTTPReceivedMsg{" +"httpMsg='" + httpMsg + '\'' +", HeaderMsg=" + HeaderMsg +", requestBody=" + Arrays.toString(requestBody) +'}';}@Overridepublic HTTPReceivedMsg parse(String message) {HTTPReceivedMsg httpReceivedMsg = new HTTPReceivedMsg();String[] split = message.split("\r\n\r\n");HashMap hashMap = new HashMap();if (split.length == 1){String[] split1 = split[0].split("\r\n");httpReceivedMsg.setHttpMsg(split1[0]);for (int i = 1; i < split1.length;i++){String[] split2 = split1[i].split("\\:");hashMap.put(split2[0],split2[1]);}}if (split.length == 2){String[] split1 = split[0].split("\r\n");httpReceivedMsg.setHttpMsg(split1[0]);for (int i = 1; i < split1.length;i++){String[] split2 = split1[i].split("\\:");hashMap.put(split2[0],split2[1]);}httpReceivedMsg.setRequestBody(split[1].getBytes());}httpReceivedMsg.setHeaderMsg(hashMap);return httpReceivedMsg;}
}
按照http报文的三个部分,首部字段和主体进行分开,首部字段前http版本行单独抽出,这样就完成了http报文解析。
实现结果如下:
POST /hello HTTP/1.1
Content-Type: application/json
User-Agent: PostmanRuntime/7.20.1
Accept: */*
Cache-Control: no-cache
Postman-Token: 23a045e5-736e-49b8-8ddd-87b1af2787e7
Host: localhost:9000
Accept-Encoding: gzip, deflate
Content-Length: 73
Connection: keep-alive{"MntNo":"ddd","ign":"fffff","pagex":"1","paze":"20","sech":"s","st":"d"}
*********************************************************************
HTTPReceivedMsg{httpMsg='POST /hello HTTP/1.1', HeaderMsg={Accept= */*, Cache-Control= no-cache, User-Agent= PostmanRuntime/7.20.1, Connection= keep-alive, Postman-Token= 23a045e5-736e-49b8-8ddd-87b1af2787e7, Host= localhost, Accept-Encoding= gzip, deflate, Content-Length= 73, Content-Type= application/json}, requestBody=[123, 34, 77, 110, 116, 78, 111, 34, 58, 34, 100, 100, 100, 34, 44, 34, 105, 103, 110, 34, 58, 34, 102, 102, 102, 102, 102, 34, 44, 34, 112, 97, 103, 101, 120, 34, 58, 34, 49, 34, 44, 34, 112, 97, 122, 101, 34, 58, 34, 50, 48, 34, 44, 34, 115, 101, 99, 104, 34, 58, 34, 115, 34, 44, 34, 115, 116, 34, 58, 34, 100, 34, 125]}
解析前报文主体是一串json,我用了一个byte[]进行接受
这就实现了一个简单的http报文的解析