http协议在传输的时候是用2进制传输文本数据的,客户端和浏览器交互是http请求报文和响应报文
http报文格式是
一个常见的请求头格式如:
POST http://localhost:3000/api HTTP/1.1
Host: localhost:3000
Connection: keep-alive
Content-Length: 0
User-Agent: ApiPOST Runtime/V2.6.1 +https://www.apipost.cn
Sec-Fetch-Site: none
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Accept: */*
{"a":2}
请求行
我们可以看到第一行就是请求行,分为Method,URI,和Version三个部分,每个部分用空格隔开
然后就是请求头,请求头部分是多行的,行之间用一个换行符隔开,
最后是数据体体,数据体和请求行是两个换行符隔开,看起来就像中间有个空行。
请求头
每个请求头部分的格式是:
- [字段名][分隔符]]字段值][换行符]
字段名是不区分大小写的,不能含有空格(有空格chrome请求失败)
字段名和分隔符之间不能有空格
字段值无限制
实体
具体传输的数据,是转化成为字符串之后的数据,POST请求有实体,而GET没有,因为GET不能用body传参数。
实体是请求报文空行之后的数据。
比如传递的参数是
{
a:1,
b:2
}
比如使用json形式传递参数,实体字符串是:
// JSON格式化后的字符串
{a:1, b:2}
比如使用x-www-urlunencode形式传递参数,实体字符串是:
a=1&b=2
比如使用formdata形式传递参数,实体字符串是:
------WebKitFormBoundaryBwrgOMvARdTvF69I
Content-Disposition: form-data; name="a"
1
------WebKitFormBoundaryBwrgOMvARdTvF69I--
Content-Disposition: form-data; name="b"
2
------WebKitFormBoundaryBwrgOMvARdTvF69I--