Skip to main content

通信协议

HTTP 是传输超文本的应用层协议,是万维网的基础之一。

  • HTTP 是非对称请求-响应协议,客户端发送请求消息,服务端响应消息
  • HTTP 是无状态协议,换句话说,当前请求不知道以前的请求做了什么

HTTP 请求和响应都是由报文组成的,包括请求报文和响应报文。

请求报文

请求报文

请求报文的 Request Line 由3部分组成

  1. 请求方法:GET
  2. 请求路径:/doc/test.html
  3. HTTP版本:HTTP/1.1

响应报文

响应报文

响应报文的 Status Line 由3部分组成

  1. HTTP版本:HTTP/1.1
  2. 状态码:200
  3. 结果: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-datajsontext 的请求体会显示为 Request Payload,但这仅仅是浏览器根据 Content-Type 进行的区分。

URI的结构

URI,全称 Uniform Resource Identifier,即统一资源标识符,用来区分互联网上不同的资源。

URI

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继续
200OK
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当前请求的来源页面 URLReferer: 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