目录
HttpClient
http报文相关
URL是为了 统一的命名网络中的一个资源(URL不是单单为了HTTP协议而定义的,而是网络上的所有的协议都可以使用) ;因此URL有以下特点:
-
URL是可移植的。(所有的网络协议都可以使用URL)
-
URL的完整性。(不能丢失数据,比如URL中包含二进制数据时,如何处理)
-
URL的可阅读性。(希望人能阅读)
因为一些历史的原因URL设计者使用US-ASCII字符集表示URL。(原因比如ASCII比较简单;所有的系统都支持ASCII) 。
http报文
http报文是面向文本的,报文中每一个字段都是一些ASCII码串,各个字段的长度是不确定的 。http有两类报文:请求报文 响应报文 。
使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号("?")代表URL的结尾与请求参数的开始,传递参数长度受限制,例如: /index.jsp?id=100&op=bind 。
1.请求行
请求行由请求方法字段、URL字段和HTT协议版本字段组成;空格隔开eg:GET /index.html HTTP/1.1
HTTP请求的方法:GET POST HEAD PUT DELETE OTIONS TRACE CONNECT
GET:一般客户端从server读取信息;请求参数和值附加在URL后面,?隔开。传递参数长度受限。eg:/etccharging?id=erdfwsaxnjdcdcd&secret=qw2dccbhcv;
POST:可以传递更多的信息给服务器,将参数封装在HTTP请求数据中,可以传递大量数据,可用来传文件。
2.消息头部
请求头部以键值对组成,一行一对,分号隔开,主要包含通知Server关于Client的请求信息;如:
User-Agent:产生请求的浏览浏览器类型;
Accet:Client端可识别的内容列表
Host:请求的主机名。
3.空行
最后一个请求头之后是一个空行、发送回车符和换行符通知服务器请求头结束,是完整的Http报文必须格式(据此可以设计解析报文)。
4.请求正文
请求数据不在GET方法中使用,一般POST中主要使用,通常设置与此相关头Content-Type 和Content-Length
HttpClient发送报文格式
multipart/form-data、x-www-form-urlencoded、raw、binary
x-www-form-urlencoded:
1,它是post的默认格式,使用URLencode转码方法。包括将name、value中的空格替换为加号;将非ascii字符做百分号编码;将input的name、value用‘=’连接,不同的input之间用‘&’连接 。
2、百分号编码:比如汉字‘武’吧,他的utf8编码在十六进制下是0xE69CA6,占3个字节,把它转成字符串‘E69CA6’,变成了六个字节,每两个字节前加上百分号前缀,得到字符串“%E6%9C%A6”,变成九个ascii字符,占九个字节。把这九个字节拼接到数据包里,这样就可以传输“非ascii字符的 utf8编码的 十六进制表示的 字符串的 百分号形式”。
3,同样使用URLencode转码,这种post格式跟get的区别在于,get把转换、拼接完的字符串用‘?’直接与表单的action连接作为URL使用,所以请求体里没有数据;而post把转换、拼接后的字符串放在了请求体里 不会在浏览器的地址栏显示,稍微安全一些。
multipart/form-data
1、对于一段utf8编码的字节,用application/x-www-form-urlencoded传输其中的ascii字符没有问题,但对于非ascii字符传输效率就很低了(汉字‘武’从三字节变成了九字节),因此在传很长的字节(如文件)时应用multipart/form-data格式。smtp等协议也使用或借鉴了此格式。
2、此格式表面上发送一段一句话和一个文件,请求体如下
同时请求头里规定了Content-Type: multipart/form-data;
boundary=----WebKitFormBoundarymNhhHqUh0p0gfFa8
可见请求体里不同的input之间用一段叫boundary的字符串分割,每个input都有了自己一个小headerÿ