首页 > 编程知识 正文

Http协议 报文解读 java自定义http报文协议解读(三)

时间:2023-05-05 03:39:20 阅读:237552 作者:3278

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; } @Override public String toString() { return "HTTPReceivedMsg{" + "httpMsg='" + httpMsg + ''' + ", HeaderMsg=" + HeaderMsg + ", requestBody=" + Arrays.toString(requestBody) + '}'; } @Override public HTTPReceivedMsg parse(String message) { HTTPReceivedMsg httpReceivedMsg = new HTTPReceivedMsg(); String[] split = message.split("rnrn"); HashMap hashMap = new HashMap(); if (split.length == 1){ String[] split1 = split[0].split("rn"); 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("rn"); 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.1Content-Type: application/jsonUser-Agent: PostmanRuntime/7.20.1Accept: */*Cache-Control: no-cachePostman-Token: 23a045e5-736e-49b8-8ddd-87b1af2787e7Host: localhost:9000Accept-Encoding: gzip, deflateContent-Length: 73Connection: 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报文的解析

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。