通信协议
HTTP 是传输超文本的应用层协议,是万维网的基础之一。
- HTTP 是非对称请求-响应协议,客户端发送请求消息,服务端响应消息
- HTTP 是无状态协议,换句话说,当前请求不知道以前的请求做了什么
HTTP 请求和响应都是由报文组成的,包括请求报文和响应报文。
请求报文
请求报文的 Request Line 由3部分组成
- 请求方法:GET
- 请求路径:/doc/test.html
- HTTP版本:HTTP/1.1
响应报文
响应报文的 Status Line 由3部分组成
- HTTP版本:HTTP/1.1
- 状态码:200
- 结果:OK
HTTP请求方法
- GET:从服务器获取网络资源
- HEAD:获取 GET 请求将获得的标头,由于标头包含数据的上次修改日期,因此可用来检查本地缓存副本
- POST:将数据上传到服务器
- PUT:要求服务器存储数据
- DELETE:要求服务器删除数据
- CONNECT:告诉代理与另一台主机建立连接并简单地回复内容
- OPTIONS:要求服务器返回它支持的请求方法列表
- TRACE:要求服务器返回其所执行操作的诊断跟踪
GET和POST的区别
最直观的是语义上的区别,还有一些具体差异。
- 请求参数:GET 的请求参数通常附加在 URL 上,并自动对非 ASCII 字符进行编码,且有长度限制;POST 请求参数在请求体中
- 可缓存性:GET 请求通常会被浏览器缓存,以提高性能;POST 请求通常不会被缓存
- 幂等性:GET 请求通常是幂等的,多次重复相同的 GET 请求不会产生不同的结果;POST 请求通常是不幂等的,多次重复相同的 POST 请求可能会产生不同的结果
POST的Content-Type
x-www-form-urlencoded
POST /test HTTP/1.1
Host: www.example.com
Content-Type: application/x-www-form-urlencoded
name=Alice&age=18常用于 Web 表单提交,数据以字符串的形式传递,适用于较简单的数据结构。
form-data
POST /test HTTP/1.1
Host: www.example.com
Content-Type: multipart/form-data; boundary="boundary"
--boundary
Content-Disposition: form-data; name="field1"
value1
--boundary
Content-Disposition: form-data; name="field2"; filename="example.txt"
value2
--boundary--常用于文件上传和包含二进制数据的情况,请求正文的结构以 boundary 分隔字段,每个字段都有唯一的标识。
json
POST /test HTTP/1.1
Host: www.example.com
Content-Type: application/json
{"name":"Alice","article":[1,2,3]}常用于 API 通信,将数据以序列化后的 JSON 字符串的形式发送到服务器。
text
POST /test HTTP/1.1
Host: www.example.com
Content-Type: application/json
Hello World常用于发送纯文本数据。
在浏览器中,x-www-form-urlencoded
的请求体会显示为 Form Data,而 form-data
,json
,text
的请求体会显示为 Request Payload,但这仅仅是浏览器根据 Content-Type 进行的区分。
URI的结构
URI,全称 Uniform Resource Identifier,即统一资源标识符,用来区分互联网上不同的资源。
https://www.example.com/s?wd=HTTP&rsv_spt=1#5_1
- scheme:协议名,例如 https,后面必须和
://
连在一起 - user:passwd@:登录主机的用户信息
- host:port:主机名和端口,例如
www.example.com
,https 默认端口 443 - path:请求路径,例如
/s
- query:查询参数,例如
wd=HTTP&rsv_spt=1
- fragment:定位资源的锚点,浏览器可以根据这个锚点跳转到对应的位置,例如
5_1
HTTP状态码
- 1xx(信息):收到请求,服务器正在继续该过程
- 2xx(成功):已成功接收、理解、接受和服务请求
- 3xx(重定向):必须采取进一步操作才能完成请求
- 4xx(客户端错误):请求包含错误的语法或无法理解
- 5xx(服务端错误):服务器无法满足看似有效的请求
常见状态码
状态码 | 描述 |
---|---|
100 | 继续 |
200 | OK |
301 | 永久移动 |
302 | 临时移动 |
304 | 未修改 |
400 | 错误请求 |
401 | 需要身份验证 |
403 | 禁止访问 |
404 | 未找到 |
405 | 方法不允许 |
408 | 请求超时 |
414 | 请求 URL 太大 |
500 | 内部服务器错误 |
501 | 方法未实现 |
502 | 错误网关 |
503 | 服务不可用 |
504 | 网关超时 |
请求头
请求字段 | 描述 | 示例 |
---|---|---|
Accept | 指定客户端可接受的响应内容类型 | Accept: text/html, application/xhtml+xml, application/xml;q=0.9, /;q=0.8 |
Authorization | 用于进行身份验证的信息 | Authorization: Bearer token |
Content-Type | 指定请求体的数据类型,通常在POST请求中使用 | Content-Type: application/json |
Content-Length | 请求体的字节长度 | Content-Length: 56 |
Cookie | 客户端的Cookie信息,用于跟踪会话状态 | Cookie: a=xxx;b=xxx |
Host | 请求的主机名和端口号 | Host: www.example.com |
Origin | 请求的来源地址,用于跨域请求时的安全验证 | Origin: https://www.example.com |
Referer | 当前请求的来源页面 URL | Referer: https://www.example.com |
User-Agent | 标识客户端的类型和版本 | User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 |
参考文章
https://www3.ntu.edu.sg/home/ehchua/programming/webprogramming/http_basics.html