HTTP 有两类报文

  • 请求报文:从客户向服务器发送请求报文
  • 响应报文:从服务器到客户的回答

    1、请求报文

    HTTP 请求报文由 请求行、请求头、空行和请求包体(body)组成,如下图:
    图片1.jpg

    1.1 请求行

  • 请求方法:表示对资源期望进行何种操作,常用的如

    • GET:请求读取由URL所标志的信息
    • POST:给服务器添加信息
    • HEAD:请求读取由URL所标志信息的首部
    • OPTION:请求一些选项信息
    • PUT:在指明的URL下存储一个文档
    • DELETE:删除指明的URL所标志的资源
  • URL:所请求的资源的 URL,表明了要操作的资源
  • 版本:HTTP 的版本

这三个部分通常使用空格(space)来分隔,最后要用 CRLF 换行表示结束,实例:

  1. GET /from/entry HTTP/1.1
  2. Host: www.baidu.com
  3. Connection: keep-alive
  4. Cache-Control: max-age=0
  5. User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36
  6. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
  7. Sec-Fetch-Site: none
  8. Sec-Fetch-Dest: document
  9. Accept-Encoding: gzip, deflate, br
  10. Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
  11. Cookie: BIDUPSID=8B0207CE0B6364E5934651E84F17999B; PSTM=1619707475;

1.2 请求头

HTTP 的报文头,报文头包含若干个属性,格式为【属性名:属性值】,服务端据此获取客户端的信息、与缓存相关的规则信息,均包含在 header 中
请求头可大致分为四种类型:

  • 通用首部字段
  • 请求首部字段
  • 响应首部字段
  • 实体首部字段

    1.3 请求体(body)

    请求体就是 HTTP 要传输的内容,HTTP 可以承载很多类型的数字数据:图片、音频、视频、HTML 文档等。

    2、响应报文

    HTTP 响应报文由状态行、响应头部、空行和响应包体(body)组成。如下图所示:
    图片2.jpg

    2.1 状态行

    状态行包含了 HTTP协议版本、状态码以及状态描述

  • 协议版本:指明了报文使用的 HTTP 协议版本

  • 状态码:一个三位数字,用来表示处理的结果,如下:
    • 1xx:表示通知信息的,如请求收到了或正在进行处理
    • 2xx:表示成功,如接受或知道了
    • 3xx:表示重定向,表示要完成请求还必须采取进一步的行动
    • 4xx:表示客户的差错,如请求中有错误的语法或不能完成
    • 5xx:表示服务器的差错,如服务器失效无法完成请求
  • 状态描述:这个是作为状态码的补充,是一段更详细的文字,帮助人们理解原因

    2.2 响应头

    和请求报文的请求头类似,响应头域允许服务器传递不能放在状态行的附加信息,这些域主要描述服务器的信息和 Request-URI 进一步的信息

    2.3 响应体(body)

    服务器返回给浏览器的响应信息,响应数据的格式是根据服务器来的,常见的响应数据格式有:

  • text/html:默认的,html文件

  • text/plain:纯文本
  • text/css:css文件
  • text/javascript:js文件
  • multipart/from-data:文本形式提交
  • application/json:json传输
  • application/xml:xml文件

    1. HTTP/1.1 200 OK
    2. Cache-Control: private
    3. Connection: keep-alive
    4. Content-Encoding: gzip
    5. Content-Type: text/html;charset=utf-8
    6. Date: Fri, 24 Dec 2021 08:20:44 GMT
    7. Expires: Fri, 24 Dec 2021 08:20:44 GMT
    8. Server: BWS/1.1
    9. Set-Cookie: H_PS_PSSID=35635_26350_35610_35562; path=/; domain=.baidu.com
    10. Strict-Transport-Security: max-age=172800
    11. Traceid: 1640334044050133761018090243032019634898
    12. X-Frame-Options: sameorigin
    13. X-Ua-Compatible: IE=Edge,chrome=1
    14. Transfer-Encoding: chunked

    3、HTTP 首部字段

    HTTP 的请求头和响应头中都是由首部字段来表示的,首部字段可以分为通用首部字段请求首部字段响应首部字段实体首部字段

    3.1 通用首部字段

    通用首部字段是指请求报文和响应报文都会使用到的首部字段,常见有:
    图片3.jpg

    Cache-Control

    通过指定的指令,就能操作缓存的工作机制。指令的参数可以多选,通过逗号分隔:

  • private 指令:响应只以特定的用户作为对象

  • public 指令:表明其他用户也可以利用缓存
  • no-cache 指令:防止从缓存中拿过期的数据
  • no-store 指令:不进行缓存
    1. Cache-Control: private, max-age=0, no-cache

    Connection

    Connent 有两个作用:控制不再转发给代理的首部字段、管理持久连接
    当服务器端想明确断开连接时,则指定 Connection 首部字段的值为 Close
    1. Connection: 不再转发的首部字段名
    2. Connection: close //管理持久连接

    Date

    首部字段 Date 表明创建 HTTP 报文的日期和时间

Transfer-Encoding

该字段规定了传输报文主体时采用的编码方式

3.2 请求首部字段

请求首部字段是从客户端往服务器端发送请求报文中所使用的字段,用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等内容
图片4.png

Accept

该字段可以通知服务器,客户端能够接收处理的媒体类型及优先级

  1. Accept: text/html,application/xhtml+xml,application/xml;q=0.3
  2. //权重值 q 的范围是 0~1,且 1 为最大值

Accept-Charest

通知服务器,客户端支持的字符集和相对优先顺利

  1. Accept-Charset: iso-8859-5, unicode-1-1;q=0.8

Accept-Encoding

告知服务器,客户端支持的内容编码及内容编码的优先级顺序,可指定多种内容编码

  1. Accept-Encoding: gzip, deflate

Accept-Language

告知服务器,客户端能够处理的自然语言集(指中文或英文等)

  1. Accept-Language: zh-cn,zh;q=0.7,en-us,en;q=0.3

User-Agent

将创建请求的浏览器和用户代理名称等信息传达给服务器

  1. User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0)

3.3 响应首部字段

响应首部字段是由服务器端向客户端返回响应报文中所使用的字段,用于补充响应的附加信息、服务器信息,以及对客户端的附加要求等信息
图片5.png

Accept-Ranges

告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源

  1. Accept-Ranges: bytes //能处理范围请求
  2. Accept-Ranges: none //不能处理范围请求

Location

该字段可以将响应接收方引导至某个与请求 URI 位置不同的资源
该字段会配合 3xx :Redirection 的响应,提供重定向的 URI

  1. Location: http://xxx/sample.html

Retry-After

告知客户端应该在多久之后再次发送请求,单位秒。主要配合状态码 503 Service Unavailable 响应,或 3xx Redirect 响应一起使用

  1. Retry-After: 120

3.4 实体首部字段

实体首部字段是包含在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息。
图片6.png

Allow

用于通知客户端能够支持 Request-URI 指定资源的所有 HTTP 方法

  1. Allow: GET, HEAD

Content-Encoding

告知客户端服务器对实体的主体部分选用的内容编码方式

  1. Content-Encoding: gzip

Content-Length

表明了实体主体部分的大小(单位是字节)

  1. Content-Length: 15000

Content-Type

说明了实体主体内对象的媒体类型

  1. Content-Type: text/html; charset=UTF-8