HTTP 头部信息详解
1. 标准 HTTP 头部
1.1 代理相关头部
- Proxy - Authenticate :这是一个响应头,重要性为低到中等。部分客户端(特别是企业环境中的客户端)只能通过代理服务器进行 HTTP 访问,而有些代理服务器需要进行身份验证。此头部是代理服务器要求身份验证的方式,它会与响应码 407(“Proxy Authentication Required”)一起发送。其工作方式与 WWW - Authenticate 类似,但它告知客户端如何与代理进行身份验证,而非与目标 Web 服务器。对 Proxy - Authenticate 挑战的响应会放入 Proxy - Authorization 头部。
- Proxy - Authorization :这是一个请求头,重要性为低到中等。该头部用于让请求通过需要身份验证的代理服务器,其工作方式与 Authorization 类似,格式取决于 Proxy - Authenticate 中定义的方案。
1.2 其他请求头部
| 头部名称 | 类型 | 重要性 | 说明 |
|---|---|---|---|
| Range | 请求头 | 中等 | 表示客户端尝试请求资源表示的一部分,通常在之前下载大表示时中断,现在回来请求剩余部分,常与 Unless - Modified - Since 一起使用。 |
| Referer | 请求头 | 低 | 当在浏览器中点击链接时,浏览器发送的 HTTP 请求中该头部的值是当前请求页面的上一个页面的 URI,可用于向服务器传达客户端在服务中的近期路径。 |
| TE | 请求头 | 低 | 类似于“Accept”类型的头部,让客户端指定可接受的传输编码,实际值主要传达客户端是否理解分块编码和 HTTP trailers。 |
| User - Agent | 请求头 | 高 | 让服务器知道发起 HTTP 请求的软件类型。在人类 Web 中通常标识浏览器品牌,在可编程 Web 中通常标识使用的 HTTP 库或客户端库。但不建议服务器根据该头部为特定客户端定制表示。 |
1.3 其他响应头部
| 头部名称 | 类型 | 重要性 | 说明 |
|---|---|---|---|
| Retry - After | 响应头 | 低到中等 | 通常与表示失败的响应码(如 413 或 5xx 系列)一起出现,告知客户端服务器当前无法处理请求,但稍后可能可以,值为客户端应再次尝试的时间或等待的秒数。服务器应使用随机化技术设置该值。 |
| Trailer | 响应头 | 低 | 当服务器使用分块传输编码发送实体主体时,可将某些 HTTP 头部放在实体主体末尾而非开头,通过 Trailer 头部指定这些头部名称。 |
| Transfer - Encoding | 响应头 | 低 | 当服务器在不知道实体主体大小等重要信息时,可将实体主体分块发送,并将 Content - Length 等头部作为“尾部”在实体主体发送后发送。HTTP 1.1 要求客户端支持分块传输编码。 |
| Upgrade | 请求头 | 非常低 | 若希望使用除 HTTP 以外的协议,可通过该头部告知服务器。若服务器支持,会返回响应码 101 并开始使用新协议。 |
| Vary | 响应头 | 低到中等 | 告知客户端可改变哪些请求头部以获取资源的不同表示,也可让缓存分别缓存不同表示。若值为“*”,则表示响应不应被缓存。 |
| Via | 请求和响应头 | 低 | 当 HTTP 请求或响应经过中间代理时,每个代理会在消息上添加该头部,接收者可通过该头部查看消息经过的中间路径。 |
| Warning | 响应头(技术上也可用于请求) | 低 | 是 HTTP 响应码的补充,通常由缓存代理等中间层插入,告知用户从响应中不明显的可能问题。每个 HTTP 警告有三位数字的“警告码”。 |
| WWW - Authenticate | 响应头 | 非常高 | 与响应码 401(“Unauthorized”)一起出现,是服务器要求客户端下次请求 URI 时提供身份验证的方式,并告知客户端期望的身份验证类型。 |
1.4 头部使用示例
graph LR
A[客户端] -->|请求| B[代理服务器]
B -->|407 + Proxy - Authenticate| A
A -->|Proxy - Authorization| B
B -->|转发请求| C[目标服务器]
C -->|响应| B
B -->|响应| A
2. 非标准 HTTP 头部
2.1 Cookie 相关头部
- Cookie :请求头,在人类 Web 中重要性高,在可编程 Web 中重要性低。它是 Netscape 扩展,不是 HTTP 标准的一部分。服务器通过 Set - Cookie 头部在客户端存储半持久状态,客户端获取 Cookie 后,后续对该服务器的每个 HTTP 请求都应返回该 Cookie。但在 REST 中,Cookie 因破坏无状态原则而名声不佳,若必须使用,应将所有状态存储在客户端。
- Set - Cookie :响应头,在人类 Web 中重要性高,在可编程 Web 中重要性低。这是服务器尝试在客户端的 Cookie 中设置半持久状态的方式,客户端应在后续请求中提供相应的 Cookie 头部,否则可能无法获得良好响应。
2.2 其他非标准头部
| 头部名称 | 类型 | 重要性 | 说明 |
|---|---|---|---|
| POE | 请求头 | 中等 | 由希望获得可用于“Post Once Exactly”请求的 URI 的客户端发送。 |
| POE - Links | 响应头 | 中等 | 是对包含 POE 头部的请求的响应,提供一个或多个客户端可 POST 的 URI,每个 URI 仅响应一次 POST 请求。 |
| Slug | 请求头 | 仅在 APP 应用中相当高 | 由 Atom Publishing Protocol 定义,用于客户端在将二进制文档 POST 到集合时指定标题。 |
| X - HTTP - Method - Override | 请求头 | 低到中等 | 一些 Web 服务支持该头部,允许客户端使用重载的 POST 进行 PUT、DELETE 等请求。建议在设计服务时将“真实”的 HTTP 方法放在 URI 的查询字符串中。 |
| X - WSSE | 请求头 | 中等 | 由 WSSE Username Token 标准定义,与 Authorization 头部一起发送,包含实际的 WSSE 凭证。由于 Web 服务器在调用 CGI 程序时不传递 Authorization 头部内容,所以设计了该头部。 |
2.3 非标准头部使用流程
graph LR
A[客户端] -->|POE 请求| B[服务器]
B -->|POE - Links 响应| A
A -->|POST 请求到指定 URI| B
3. HTTP 响应码
3.1 常见响应码分类
| 响应码范围 | 说明 | 常见响应码示例 |
|---|---|---|
| 1xx | 信息性状态码 | 100 “Continue”,101 “Switching Protocols” |
| 2xx | 成功状态码 | 200 “OK”,201 “Created”,202 “Accepted” |
| 3xx | 重定向状态码 | 301 “Moved Permanently”,302 “Found”,303 “See Other” |
| 4xx | 客户端错误状态码 | 400 “Bad Request”,401 “Unauthorized”,403 “Forbidden” |
| 5xx | 服务器错误状态码 | 500 “Internal Server Error”,503 “Service Unavailable” |
3.2 响应码使用示例
当客户端向服务器发送请求时,服务器根据处理结果返回相应的响应码:
graph LR
A[客户端] -->|请求| B[服务器]
B -->|200 OK| A
B -->|404 Not Found| A
B -->|500 Internal Server Error| A
4. 总结
HTTP 头部和响应码在 Web 通信中起着至关重要的作用。标准头部和非标准头部各自有其特定的用途,理解它们的含义和使用场景有助于更好地开发和调试 Web 应用程序。同时,合理使用响应码可以准确地向客户端传达请求的处理结果,提高用户体验和系统的可靠性。在实际开发中,应根据具体需求选择合适的头部和响应码,并遵循相关的最佳实践。
5. 资源操作与 HTTP 方法
5.1 HTTP 方法概述
HTTP 定义了多种方法用于对资源进行不同的操作,这些方法构成了 RESTful 架构中统一接口的重要部分。以下是常见 HTTP 方法的介绍:
| 方法 | 描述 | 安全性与幂等性 |
| ---- | ---- | ---- |
| GET | 用于获取资源的表示,是安全且幂等的方法。常用于读取只读资源,如获取文章、图片等。 | 安全、幂等 |
| HEAD | 与 GET 类似,但只返回响应头部,不返回实体主体。常用于检查资源的元信息,如文件大小、修改时间等,也是安全且幂等的。 | 安全、幂等 |
| POST | 用于创建或追加资源,通常用于提交表单数据、创建新对象等。不是安全方法,也不保证幂等性。 | 不安全、不幂等 |
| PUT | 用于更新资源,若资源不存在则创建新资源。是幂等方法,但不是安全方法。 | 不安全、幂等 |
| DELETE | 用于删除资源,是幂等方法,但不是安全方法。 | 不安全、幂等 |
| OPTIONS | 用于获取服务器支持的请求方法,可用于检查资源的可用操作,是安全且幂等的。 | 安全、幂等 |
5.2 HTTP 方法使用示例
graph LR
A[客户端] -->|GET 请求| B[服务器]
B -->|资源表示| A
A -->|POST 请求创建资源| B
B -->|201 Created| A
A -->|PUT 请求更新资源| B
B -->|200 OK| A
A -->|DELETE 请求删除资源| B
B -->|204 No Content| A
6. 资源设计与 URI
6.1 URI 设计原则
URI(Universal Resource Identifier)是资源的唯一标识,设计良好的 URI 对于 RESTful 服务至关重要。以下是一些 URI 设计的原则:
-
地址性
:URI 应具有良好的地址性,能够准确地定位资源。例如,
https://example.com/articles/1
可以明确地指向一篇文章。
-
可读性
:URI 应具有一定的可读性,方便用户和开发者理解。避免使用无意义的字符和数字,尽量使用有意义的单词和短语。
-
永久性
:URI 应尽量保持永久不变,避免频繁更改,以确保资源的长期可访问性。
6.2 URI 设计示例
以下是一个简单的 URI 设计示例,用于管理用户和文章资源:
| 资源 | URI 示例 | 操作 |
| ---- | ---- | ---- |
| 用户集合 |
https://example.com/users
| GET:获取所有用户列表;POST:创建新用户 |
| 单个用户 |
https://example.com/users/1
| GET:获取指定用户信息;PUT:更新指定用户信息;DELETE:删除指定用户 |
| 文章集合 |
https://example.com/articles
| GET:获取所有文章列表;POST:创建新文章 |
| 单个文章 |
https://example.com/articles/1
| GET:获取指定文章信息;PUT:更新指定文章信息;DELETE:删除指定文章 |
6.3 URI 模板
URI 模板可以用于生成动态的 URI,方便处理不同的请求。例如:
https://example.com/articles/{article_id}
其中
{article_id}
是一个变量,可以根据实际情况替换为具体的文章 ID。
7. 身份验证与安全
7.1 HTTP 身份验证方式
HTTP 提供了多种身份验证方式,常见的有:
-
基本身份验证(Basic Authentication)
:客户端将用户名和密码进行 Base64 编码后放在 Authorization 头部发送给服务器。这种方式简单但安全性较低,因为 Base64 编码可以很容易被解码。
-
摘要身份验证(Digest Authentication)
:通过对用户名、密码、请求方法、URI 等信息进行哈希处理,生成一个摘要信息发送给服务器。相比基本身份验证,摘要身份验证更加安全。
-
WSSE 身份验证(WSSE HTTP Authentication)
:由 WSSE Username Token 标准定义,通过 X - WSSE 头部传递身份验证凭证,可绕过不理解 WSSE 授权的 Web 服务器。
7.2 身份验证流程示例
graph LR
A[客户端] -->|请求资源| B[服务器]
B -->|401 Unauthorized + WWW - Authenticate| A
A -->|Authorization 头部(包含凭证)| B
B -->|验证通过,返回资源| A
7.3 安全注意事项
在进行身份验证和安全设计时,需要注意以下几点:
-
使用 HTTPS
:确保数据在传输过程中的安全性,避免信息被窃取和篡改。
-
合理设置权限
:根据用户的角色和权限,限制对资源的访问,避免未授权的访问。
-
防止 CSRF 攻击
:使用 CSRF 令牌等机制,防止跨站请求伪造攻击。
8. 缓存机制
8.1 缓存的作用
缓存可以减少服务器的负载,提高响应速度,降低网络带宽的使用。在 HTTP 中,缓存可以分为客户端缓存和代理缓存。
8.2 缓存相关头部
- Cache - Control :用于控制缓存的行为,如是否允许缓存、缓存的时间等。例如:
Cache - Control: max - age = 3600
表示缓存的最大时间为 3600 秒。
-
ETag
:是资源的唯一标识符,服务器可以在响应中返回 ETag,客户端下次请求时可以通过 If - None - Match 头部携带该 ETag,服务器根据 ETag 判断资源是否有更新。
-
Last - Modified
:表示资源的最后修改时间,客户端下次请求时可以通过 If - Modified - Since 头部携带该时间,服务器根据该时间判断资源是否有更新。
8.3 缓存流程示例
graph LR
A[客户端] -->|请求资源| B[服务器]
B -->|资源 + ETag + Last - Modified| A
A -->|再次请求资源,携带 If - None - Match 和 If - Modified - Since| B
B -->|资源未修改,返回 304 Not Modified| A
9. 总结与实践建议
9.1 总结
本文详细介绍了 HTTP 头部、响应码、资源操作、URI 设计、身份验证、安全和缓存等方面的知识。这些知识是构建 RESTful Web 服务的基础,理解和掌握它们对于开发高效、安全、可扩展的 Web 应用程序至关重要。
9.2 实践建议
- 遵循 REST 原则 :在设计和开发 Web 服务时,遵循 RESTful 架构的原则,确保服务具有良好的可扩展性和可维护性。
- 合理使用 HTTP 头部和响应码 :根据不同的业务需求,选择合适的 HTTP 头部和响应码,准确地传达请求的处理结果。
- 注重安全和性能 :采用合适的身份验证方式和缓存机制,保障服务的安全性和性能。
- 持续学习和实践 :RESTful 架构和 HTTP 协议不断发展和完善,持续学习和实践可以帮助我们跟上技术的步伐,开发出更优秀的 Web 应用程序。
超级会员免费看
2565

被折叠的 条评论
为什么被折叠?



