HTTP 请求 API 是客户端(如浏览器、移动应用)与服务器之间进行数据交互的核心机制,一个完整的 HTTP 请求并非仅仅是一个简单的 URL 访问,而是由多个结构化部分组成的复合体,理解这些组成部分对于开发高效、安全的接口至关重要。

请求行 (Request Line)
请求行是 HTTP 请求的第一行,它告诉服务器客户端想要执行什么操作以及目标资源在哪里,它由三个部分组成,用空格分隔:
- 方法 (Method):定义了对资源的操作类型,常见的包括:
GET:获取资源。POST:提交数据以创建新资源。PUT:更新现有资源。DELETE:删除资源。PATCH:部分更新资源。
- 请求 URI (Request-URI):标识资源的路径,可能包含查询参数(Query String)。
- HTTP 版本:指明使用的 HTTP 协议版本,如
HTTP/1.1或HTTP/2。
示例:
GET /api/users/123?active=true HTTP/1.1
请求头 (Request Headers)
请求头提供了关于请求的元数据,帮助服务器理解如何处理请求,它们由键值对组成,每行一个,常见的请求头包括:
| 请求头名称 | 描述 | 示例值 |
|---|---|---|
Host |
指定请求的目标主机和端口号(HTTP/1.1 必需) | www.example.com:8080 |
Content-Type |
指示请求体的媒体类型 | application/json |
Authorization |
用于身份验证的凭证 | Bearer eyJhbGciOi... |
Accept |
客户端希望接收的内容类型 | application/json |
User-Agent |
客户端软件的信息 | Mozilla/5.0 ... |
Cache-Control |
控制缓存行为 | no-cache |
请求体 (Request Body)
请求体是可选部分,主要用于 POST、PUT 和 PATCH 等方法,用于向服务器发送实际的数据,其格式取决于 Content-Type 头部的设置。
- JSON:最常用于现代 API,结构清晰,易于解析。
{ "username": "john_doe", "email": "john@example.com", "role": "admin" } - Form Data:传统表单提交格式,键值对形式。
username=john_doe&email=john@example.com&role=admin
- Multipart/Form-Data:用于上传文件,包含边界分隔符。
- XML:较老的技术,但在某些企业级系统中仍在使用。
注意:GET 请求通常没有请求体,参数通过 URL 查询字符串传递。

完整 HTTP 请求示例
以下是一个典型的 JSON API 请求的完整结构:
POST /api/v1/users HTTP/1.1
Host: api.example.com
Content-Type: application/json
Authorization: Bearer <token>
Accept: application/json
Content-Length: 45
{"name": "Alice", "age": 30}
解析:
- 请求行:
POST /api/v1/users HTTP/1.1 - 请求头:包含
Host、Content-Type、Authorization等元数据。 - 空行:请求头和请求体之间必须有一个空行,表示头部结束。
- 请求体:
{"name": "Alice", "age": 30},即实际发送的数据。
关键注意事项
- 安全性:敏感信息(如密码、令牌)不应出现在 URL 或请求头中,应通过 HTTPS 加密传输,并放在请求体或
Authorization头中。 - 幂等性:
GET、PUT、DELETE是幂等的,多次执行结果相同;POST通常不是幂等的,每次执行可能创建新资源。 - 字符编码:确保请求体和头部使用正确的字符编码(通常是 UTF-8),避免乱码问题。
相关问题与解答
问题 1:为什么 GET 请求通常不建议携带请求体(Request Body)?
解答:
虽然 HTTP 协议规范并未严格禁止 GET 请求携带请求体,但在实际开发和大多数服务器实现中,GET 请求不应包含请求体,原因如下:
- 语义不符:GET 方法的语义是“获取”资源,而不是“提交”数据,数据应通过 URL 查询参数(Query String)传递。
- 缓存问题:GET 请求通常会被浏览器和中间代理服务器缓存,GET 请求携带请求体,缓存行为会变得复杂且不可预测,可能导致数据不一致。
- 长度限制:URL 长度有限制(不同浏览器和服务器限制不同),而请求体可以非常大,将数据放在请求体中可能超出 URL 长度限制。
- 安全性:GET 请求的 URL 会被记录在服务器日志、浏览器历史记录和代理日志中,如果请求体中包含敏感数据,这些信息会暴露。
问题 2:如何正确设置 Content-Type 头部以支持 JSON 数据交换?

解答:
要正确支持 JSON 数据交换,需遵循以下步骤:
- 客户端发送时:在请求头中设置
Content-Type: application/json,这告诉服务器请求体中的数据是 JSON 格式,服务器会据此解析数据。 - 服务器响应时:在响应头中也设置
Content-Type: application/json,告知客户端响应体是 JSON 格式,客户端(如浏览器或前端框架)会据此自动解析。 - 数据格式:确保请求体和响应体是合法的 JSON 字符串,使用双引号包裹键和字符串值,避免使用单引号或尾随逗号。
- 示例:
- 请求头:
Content-Type: application/json - 请求体:
{"key": "value"} - 响应头:
Content-Type: application/json - 响应体:
{"status": "success", "data": {...}}
- 请求头:
Content-Type 设置错误(如设置为 text/plain 或 application/x-www-form-urlencoded),服务器可能无法正确解析 JSON 数据,导致 400 Bad Request 错误。
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/493474.html