HTTP报文结构


前言

掌握 HTTP 报文结构,有利于加深对客户端和服务器交互过程的理解。


一、HTTP请求报文

1.组成部分

  • 请求行
    请求方法(GET、POST等) 目标URL地址 HTTP协议版本
  • 请求头
    Accept:此字段用于告知服务器,客户端能够处理哪些资源类型及这些资源类型的相对优先级。
    Accept-Encoding:此字段用于告知服务器,客户端支持的内容编码方式及其优先级。内容编码通常是用于数据压缩的,例如gzip或deflate,这有助于减少传输的数据量。
    Accept-Language:此字段用于告知服务器,客户端期望返回的内容的语言。它可以包含多个语言标签,并可以设置优先级,使得服务器可以根据用户的偏好返回不同语言的内容。
    User-Agent:此字段包含了关于发送请求的应用程序或用户代理的信息。它通常包含了浏览器类型、版本、操作系统等信息,有助于服务器了解客户端的环境。
    Content-Type:当请求中包含请求体时,此字段用于指定请求体的媒体类型。例如,当提交表单数据时,它可能被设置为application/x-www-form-urlencoded;当发送JSON数据时,它可能被设置为application/json。
    Content-Length:此字段用于表示请求体的长度,以字节为单位。它有助于服务器在接收数据时了解何时结束。
    Host:此字段指定了请求的目标主机名和端口号(如果端口号不是HTTP默认的80或者HTTPS默认的443)。它是HTTP/1.1规范中必须的一个字段。
    Referer: 包含了发送请求的页面的URL,用于标识请求的来源。
    Cookie:此字段包含了客户端发送给服务器的cookie。cookie通常用于身份验证、会话管理等功能。
    Cache-Control:此字段用于指定请求或响应的缓存策略。例如,它可以指示请求不应被缓存,或者响应应被缓存多长时间。强制缓存中,http1.1 用于判断缓存是否失效的字段。
    Authorization:当客户端需要对请求进行身份验证时,此字段包含了身份验证信息。它通常与HTTP认证机制一起使用,比如 token。
    Connection: 指定了客户端是否希望保持网络长连接。keep-alive意味着客户端希望保持连接,以便进行后续的请求。
    If-Modified-Since: 包含了客户端上次请求该资源时服务器返回的 Last-Modified 字段的值。
    If-None-Match: 包含了客户端上次请求该资源时服务器返回的 ETag 字段的值。
  • 空行
    分隔 请求体和请求体,遇到空行表示请求头的结束。
  • 请求体
    可选的。通常发生在POST、PUT或PATCH等请求方法中,包含了发送给服务器的实际数据,可以是表单数据、上传的文件或其他类型的数据。如果请求体存在,请求头中通常会包含一个Content-Length字段来标识请求体的长度。

2.实例

GET /example HTTP/1.1  
Host: www.example.com  
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.9999.99 Safari/537.36  
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9  
Accept-Encoding: gzip, deflate  
Accept-Language: en-US,en;q=0.9,fr;q=0.8  
Cache-Control: no-cache  
Cookie: session_id=12345; user_id=67890  
If-Modified-Since: Mon, 27 Jul 2020 12:00:00 GMT  
If-None-Match: "123456"
Connection: keep-alive  
Referer: https://www.google.com/  
DNT: 1  
Pragma: no-cache
  
username=john_doe&password=mypassword

二、HTTP响应报文

1.组成部分

  • 响应行
    协议版本 状态码 状态描述
  • 响应头
    Server:这个字段描述了服务器的信息,如服务器的软件名称和版本。
    Content-Type:这个字段告诉客户端响应体的媒体类型。例如,对于HTML文档,它可能是text/html;对于JPEG图像,它可能是image/jpeg。
    Content-Length:这个字段表示响应体的长度,以字节为单位。它有助于客户端知道响应体的大小,以便正确地接收和解析数据。
    Content-Encoding:这个字段描述了响应体使用的内容编码。常见的编码类型包括gzip和deflate,它们用于压缩数据以减少传输大小。
    Cache-Control:这个字段用于指定缓存指令,控制响应内容在客户端、代理服务器或其他中间缓存中的缓存行为。http1.1
    Expires:这个字段提供了一个日期和时间,表示响应内容在何时过期。之后,缓存的响应不应再被使用,直到从服务器获取新的响应。http1.0
    ETag:这是一个由服务器生成的唯一标识符,用于标识资源的特定版本。当资源内容发生变化时,ETag也会变化。它常用于条件请求(如使用If-None-Match字段)来检查资源是否已修改。
    Last-Modified: 告诉客户端资源的最后修改时间,配合请求头中的 if-modified-since 字段。
    Set-Cookie:这个字段用于设置HTTP cookie,这些 cookie 随后会由浏览器发送回服务器,以便进行会话跟踪或个性化设置。
    Location:在某些情况下,如重定向,这个字段提供了资源的替代位置。当状态码为 3xx 时,这个字段特别有用。
    Connection:这个字段控制是否保持网络连接。例如,Connection: keep-alive表示连接应保持打开状态,以便后续请求可以在同一连接上发送。
  • 空行
    分隔作用
  • 响应体
    服务器返回给客户端的实际数据。这可以是HTML页面、JSON数据、图片或其他类型的资源。如果服务器返回了一个HTML页面,那么页面的内容就会包含在响应体中。

2.实例

HTTP/1.1 200 OK  
Server: nginx/1.19.2  
Date: Tue, 17 Aug 2023 12:34:56 GMT  
Content-Type: text/html; charset=UTF-8  
Content-Length: 12345  
Connection: keep-alive  
Last-Modified: Mon, 16 Aug 2023 11:22:33 GMT  
ETag: "abcdef123456"  
Cache-Control: max-age=3600  
Set-Cookie: session_id=1234567890abcdef; expires=Wed, 17 Sep 2023 12:34:56 GMT; path=/; HttpOnly  
  
<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <title>Example Page</title>  
</head>  
<body>  
    <h1>Welcome to the Example Page!</h1>  
    <p>This is an example of an HTTP response body.</p>  
</body>  
</html>

总结

本篇文章整理了自己一直以来比较模糊的知识点,以记促思。

  • 26
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值