HTTP 响应
HTTP - 响应
Section titled “HTTP - 响应”服务器在接收并解释客户端的请求消息后,会返回一个 HTTP 响应消息。响应消息的结构与请求消息类似:
- 一个 状态行(Status-Line)
- 零个或多个 头部字段(Header fields) (通用、响应、表示头),后跟 CRLF
- 一个 空行(Empty line) (CRLF),表示头部字段的结束
- 可选的,一个 消息体(Message-body)
状态行(Status-Line)的结构如下:Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLFHTTP 版本
Section titled “HTTP 版本”这表明服务器在响应中使用的 HTTP 版本。例如:
HTTP-Version = HTTP/1.1支持 HTTP/2 或 HTTP/3 的服务器将在帧层(framing layer)以不同方式处理版本控制,但通常会为状态行概念保持 HTTP/1.1 的语义。
状态码(Status Code)
Section titled “状态码(Status Code)”状态码(Status-Code)是一个 3 位整数,表示客户端请求的结果。第一位数字定义了响应的类别:
| 序号 | 类别 | 描述 |
|---|---|---|
| 1 | 1xx: 信息类响应 | 请求已被接收,正在继续处理。(例如,100 Continue) |
| 2 | 2xx: 成功 | 操作已成功接收、理解并接受。(例如,200 OK, 201 Created) |
| 3 | 3xx: 重定向 | 客户端必须采取进一步操作才能完成请求。(例如,301 Moved Permanently, 302 Found) |
| 4 | 4xx: 客户端错误 | 请求包含错误语法或服务器无法完成请求。(例如,400 Bad Request, 401 Unauthorized, 404 Not Found) |
| 5 | 5xx: 服务器错误 | 服务器未能完成一个显然有效的请求。(例如,500 Internal Server Error, 503 Service Unavailable) |
在专门的章节中有完整的状态码列表。HTTP 应用程序无需理解所有已注册的状态码,但应能够处理响应的类别。
原因短语(Reason-Phrase)
Section titled “原因短语(Reason-Phrase)”原因短语(Reason-Phrase)是对状态码(Status-Code)的简短、易于人类阅读的文本描述。它仅用于提供信息,不会影响协议对响应的解释。示例:OK、Not Found、Internal Server Error。
客户端应依赖于数值状态码(Status-Code),而不是原因短语(Reason-Phrase)来判断结果。
响应头部字段(Response Header Fields)
Section titled “响应头部字段(Response Header Fields)”响应头部字段允许服务器传递关于响应的额外信息,这些信息无法放在状态行(Status-Line)中。这些头部提供有关服务器、资源或客户端应如何处理响应的详细信息。
常见的响应头部包括:
- Date: 响应生成时的日期和时间。
- Server: 关于所用服务器软件的信息。
- Content-Type: 响应体的媒体类型。
- Content-Length: 响应体的字节长度。
- Content-Encoding: 应用于响应体的任何编码(例如,压缩)。
- Last-Modified / ETag: 用于缓存的验证器。
- Cache-Control / Expires: 缓存指令。
- Set-Cookie: 指示客户端存储一个 cookie。
- Location: 在重定向响应(3xx)中使用,指定新的 URL。
- Allow: 列出资源支持的 HTTP 方法(通常与 405 Method Not Allowed 一起使用)。
- WWW-Authenticate: 与 401 Unauthorized 响应一起发送,定义身份验证挑战。
- Strict-Transport-Security: 指示浏览器将来对此域名的请求仅使用 HTTPS。
- Content-Security-Policy: 通过指定允许的内容源来帮助防止 XSS 攻击。
开发者也可以包含自定义头部,用于应用程序特定的目的。
响应消息示例
Section titled “响应消息示例”示例 1:成功响应,包含 HTML 内容 (200 OK)
HTTP/1.1 200 OKDate: Mon, 21 Feb 2022 12:30:00 GMTServer: MyWebServer/1.0Last-Modified: Sun, 20 Feb 2022 10:00:00 GMTETag: "xyz123abc"Content-Type: text/html; charset=utf-8Content-Length: 150Connection: keep-aliveCache-Control: max-age=3600
<!DOCTYPE html><html><head><title>Success</title></head><body><h1>Hello, World!</h1><p>This is a sample page.</p></body></html>示例 2:资源未找到 (404 Not Found)
HTTP/1.1 404 Not FoundDate: Mon, 21 Feb 2022 12:35:00 GMTServer: MyWebServer/1.0Content-Type: application/json; charset=utf-8Content-Length: 36Connection: close
{ "error": "Resource not found"}示例 3:重定向 (301 Moved Permanently)
HTTP/1.1 301 Moved PermanentlyDate: Mon, 21 Feb 2022 12:40:00 GMTServer: MyWebServer/1.0Location: https://www.newexample.com/newpage.htmlContent-Length: 0Connection: keep-alive
(301 通常没有消息体,或者为旧客户端提供简短的 HTML 说明)