Skip to content

HTTP 请求

HTTP 客户端通过向服务器发送 HTTP 请求来发起通信。此请求消息遵循特定的格式:

  • 一个 请求行 (Request-line)
  • 零个或多个 首部字段 (Header fields)(通用、请求、表示首部),后跟 CRLF
  • 一个 空行 (Empty line) (CRLF),表示首部字段的结束
  • 可选地,一个 消息主体 (Message-body)
请求行具有以下结构:
Request-Line = Method SP Request-URI SP HTTP-Version CRLF

我们来详细分解请求行的每个部分。

请求方法指示要对由 Request-URI 标识的资源执行的操作。方法区分大小写,并且总是大写。HTTP/1.1 及更高版本中的常见方法包括:

序号方法描述
1GET检索指定资源的表示。GET 请求应仅用于检索数据,并且是幂等且安全的(在服务器上没有副作用)。
2HEAD与 GET 相同,但服务器绝对不能在响应中返回消息主体。它用于在不传输整个内容的情况下检索资源的元信息(首部)。幂等且安全。
3POST向指定的资源提交一个实体,通常导致服务器状态的改变或产生副作用(例如,创建新资源、提交表单数据、触发一个进程)。非幂等,不安全。
4PUT用请求负载替换目标资源的所有当前表示。如果资源不存在,可以创建它。幂等,但不安全。
5DELETE移除指定的资源。幂等,但不安全。
6PATCH对资源应用局部修改。不一定幂等(取决于补丁格式和服务器逻辑),不安全。
7OPTIONS描述目标资源的通信选项(例如,允许的方法、CORS 首部)。幂等且安全。
8CONNECT建立一个到由目标资源标识的服务器的隧道。主要由代理使用以隧道传输 HTTPS 流量。
9TRACE沿目标资源路径执行消息回环测试,对调试有用。可能存在安全隐患(XST - 跨站追踪),通常被禁用。

Request-URI(统一资源标识符)标识要应用请求的资源。它可以有几种形式:

Request-URI = "*" | absoluteURI | abs_path | authority
序号形式描述
1星号 (*)与 OPTIONS 方法一起使用,当请求不应用于特定资源,而是应用于服务器本身时(例如,OPTIONS * HTTP/1.1)。
2absoluteURI向代理发出请求时使用。代理转发请求或从缓存中提供服务(例如,向代理发送 GET http://www.example.com/index.html HTTP/1.1)。
3abs_path最常见的形式,用于向源服务器的请求。它是 URL 的路径部分(例如,/path/to/resource.html)。如果路径为空,它必须被指定为 ”/“(服务器根目录)。示例:GET /pub/WWW/TheProject.html HTTP/1.1(需要一个 Host 首部)。
4authority仅由 CONNECT 方法使用(例如,CONNECT www.example.com:443 HTTP/1.1)。

请求首部字段 (Request Header Fields)

Section titled “请求首部字段 (Request Header Fields)”

请求首部字段允许客户端向服务器传递关于请求和客户端自身的附加信息。这些字段充当请求修饰符。常见的请求首部包括:

  • Host: 指定服务器的域名 (HTTP/1.1 必需)。
  • User-Agent: 描述发出请求的客户端软件。
  • Accept: 通知服务器客户端可以处理的媒体类型 (MIME 类型)。
  • Accept-Language: 通知服务器客户端偏好的自然语言。
  • Accept-Encoding: 通知服务器客户端支持的内容编码 (压缩)。
  • Authorization: 包含用于向服务器验证客户端身份的凭据 (例如,Basic <credentials>,Bearer <token>)。
  • Content-Type: 指示请求主体 (用于 POST, PUT, PATCH) 的媒体类型。
  • Content-Length: 指示请求主体的大小,以字节为单位。
  • If-Modified-Since / If-None-Match: 用于条件请求,常用于缓存。
  • Cookie: 将之前存储的 Cookie 发送回服务器。

自定义首部(历史上常以 X- 为前缀,尽管对于新的、非标准的首部,现在已不再推荐这种做法)也可以用于特定的应用程序需求。

示例 1: GET 请求获取 HTML 页面

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/98.0.4758.102
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Upgrade-Insecure-Requests: 1
(GET 请求没有消息主体)

示例 2: 包含 JSON 数据的 POST 请求

POST /api/users HTTP/1.1
Host: api.example.com
User-Agent: MyApp/1.0
Content-Type: application/json; charset=utf-8
Content-Length: 55
Accept: application/json
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Connection: keep-alive
{
"username": "newUser",
"email": "new@example.com"
}

示例 3: 包含表单数据的 POST 请求

POST /submit-form HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 27
Accept-Language: en-US
Connection: keep-alive
name=John+Doe&email=john%40example.com