HTTP-互联网数据传输的基石(三)

226 阅读6分钟

HTTP

HTTP(超文本传输协议)是一种应用层协议,基于TCP协议(还不知道TCP的可参考补阙拾遗(二)-网络中的传输层(TCP/UDP))或是理论上来说可以借助任何可靠的传输协议。同时HTTP 也是一个客户端—服务器协议:请求由一个实体,即用户代理(user agent),或是一个可以代表它的代理方(proxy)发出。大多数情况下,这个用户代理都是一个 Web 浏览器,不过它也可能是任何东西,比如一个爬取网页来充实、维护搜索引擎索引的机器爬虫。它允许客户端(通常是Web浏览器)从服务器请求并接收超文本(如HTML文档)、图像、视频、音频文件等各种类型的资源。它定义了客户端和服务器之间的通信格式和规则,包括请求消息、响应消息以及数据传输的格式,它是 Web 上进行任何数据交换的基础。(HTTP协议应该是每一个前端开发者都会接触到的一个协议)

协议规定的内容

HTTP协议规定了两个方面的内容:

  1. 通信的模式
  2. 通信的格式

通信模式

利用HTTP协议客户端与服务端之间可通过交换一个个独立的消息(而非数据流)进行通信。由客户端发出的消息被称作请求(request),由服务端发出的应答消息被称作响应(response),所以HTTP通信并是以 请求——响应 这样简单的方式进行通信的,

http.png

通信报文格式

HTTP通信报文包括请求报文响应报文

HTTP请求信息格式

HTTP请求信息格式是一种纯文本的格式,主要分为三个部分(其实有四部分请求头请求体之间还有个空行):

  1. 请求行(Request Line)

    请求行是HTTP请求的第一行,包含了三个关键元素,用空格分隔:

    • 方法(Method) :描述了客户端希望对服务器上的资源执行的操作。常见的HTTP方法有GET、POST、PUT、DELETE等。例如,GET用于请求资源,POST用于提交数据。
    • 请求URI(Uniform Resource Identifier) :这是要访问的资源的标识符,即URL的一部分,不包括协议和主机信息,仅指明请求资源的路径和查询字符串。例如,/index.html/api/data?key=value
    • 协议版本(Protocol Version) :指出了正在使用的HTTP协议版本,目前最常用的是HTTP/1.1和HTTP/2。例如,HTTP/1.1

    示例请求行:

    GET /index.html HTTP/1.1
    
  2. 请求头(Request Headers)

    请求头是紧随请求行之后的一系列键值对,每一对占一行,用于传递关于客户端、请求本身或客户端期望的响应的附加信息。这些信息不是请求主体的一部分,但对服务器如何处理请求至关重要。常见的请求头包括但不限于:

    • Host: 指定请求的服务器的域名和端口号。
    • Accept: 指出客户端能够处理的内容类型(浏览器可以接受的文件类型)。
    • Accept-Encodeing:浏览器允许的压缩编码
    • User-Agent: (用户代理,他是一段用来描述浏览器信息的字符串)描述发出请求的浏览器或其他客户端软件的信息。
    • Cookie: 包含之前服务器设置的任何cookies,用于会话管理或个性化设置。
    • Authorization: 可能包含用于验证用户身份的凭证。
    • Content-Type:它指示了发送到服务器或者从服务器接收到的响应体中的数据的MIME类型(多用途互联网邮件扩展类型)

    示例请求头:

     Accept:text/plain, */*; q=0.01
     Accept-Encoding:gzip, deflate, br, zstd
     Accept-Language:zh-CN,zh;q=0.9
     Host:www.baidu.com
     Sec-Ch-Ua:"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"
     User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36
     X-Requested-With:XMLHttpRequest
    
  3. 请求体(Request Body)

    请求体是可选的,并非所有HTTP请求都有请求体。它主要用于包含发送给服务器的数据,这在POST、PUT等方法的请求中常见。例如,在表单提交时,请求体可能包含表单字段的数据。请求体的内容类型由请求头中的Content-Type指定,常见的类型有:

    1. application/x-www-form-urlencoded: 这是最常见的类型,特别是在提交HTML表单时。数据被编码成URL格式,其中键值对由&字符分隔,键和值之间由=连接(例如:key1=value1&key2=value2)。
    2. multipart/form-data: 用于上传文件或多部分数据,这种类型可以同时发送文件和其他表单字段,可以使用边界(boundary)来分隔不同的部分,每个部分可以有其自己的MIME类型(MIME类型是一种标准化的标识符,用于表示数据或文件的格式类型)。
    3. application/json: 用于发送JSON格式的数据。这是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。
    4. text/plain: 用于发送纯文本数据,没有特殊格式,这种类型通常用于发送简单的文本信息。
    5. application/octet-stream: 用于发送二进制数据,如图片、音频或视频文件。

    请求体的内容长度应通过Content-Length请求头来指定,以便服务器知道何时读取完毕。

HTTP响应信息格式

HTTP协议中服务器对客户端请求的回应,响应信息格式也主要分为三个部分(同样有四部分响应头响应体之间还有个空行):

  1. 响应行(Status Line)

    响应行是响应消息的第一行,包含以下三个要素,用空格分隔:

    1. 协议版本(Protocol Version) :表明服务器使用的HTTP协议版本,通常与请求中的协议版本相匹配。

    2. 状态码(Status Code) :一个三位数的代码,用来告知客户端请求的处理结果。

      • 响应状态码的规则

        1. 1xx:请求处理中
        2. 2xx:表示成功
        3. 3xx:表示请求重定向
        4. 4xx:表示客户端错误
        5. 5xx:服务器错误
    3. 状态消息(Reason Phrase) :是对状态码的简单描述文本,帮助理解状态码的意义,如OKNot Found等。虽然在现代HTTP协议中它的作用已经减弱,但仍然存在。

    例如:

    HTTP/1.1 200 OK
    
  2. 响应头(Response Headers)

    响应头紧跟在响应行之后,是一系列以冒号分隔的键值对,每对占一行,提供了关于响应的元数据。常见的响应头包括:

    • Content-Type: 告诉客户端响应体的数据类型。
    • Content-Length: 响应体的字节数。
    • Server: 服务器的软件信息。
    • Date: 响应的时间戳。
    • Set-Cookie: 用于设置或更新cookie。
    • Location: 在重定向时使用,指示新的资源位置。

例如:

 Content-Length: 651
 Content-Type: application/json; charset=utf-8
 Date: Fri, 05 Jul 2024 09:44:00 GMT
  1. 响应体(Response Body)

    响应体是服务器返回给客户端的实际数据内容,可能是HTML文档、图片、JSON数据等。响应体的内容类型由响应头中的Content-Type指定。并非所有响应都包含响应体,如某些状态码为1xx或某些204 No Content的响应就没有响应体。