无论请求还是响应,结构都分为三个主要部分:起始行、头部 (Headers) 和 主体 (Body) 。
1. HTTP 请求结构 (Request)
当你通过 URLRequest 发起调用时,发出的数据包长这样:
-
起始行 (Start Line) :
- Method:操作类型(GET, POST 等)。
- Path:资源的路径(如
/api/v1/user)。 - Version:协议版本(如
HTTP/1.1)。
-
请求头 (Request Headers) :
键值对形式,告知服务器客户端的信息。
Content-Type: 告诉服务器 Body 是什么格式(如application/json)。Authorization: 携带 Token 进行身份验证。User-Agent: 标识是 iOS 设备还是浏览器。
-
空行 (CRLF) :必须存在,用来分隔头部和主体。
-
请求体 (Request Body) :
实际发送的数据。如果是 GET 请求,通常为空;如果是 POST,则包含 JSON 或表单数据。
2. HTTP 响应结构 (Response)
当服务器处理完你的请求后,返回的数据包结构如下:
-
状态行 (Status Line) :
- Version:协议版本。
- Status Code:状态码(如
200代表成功,404代表未找到)。 - Reason Phrase:状态描述(如
OK或Not Found)。
-
响应头 (Response Headers) :
服务器返回的元数据。
Set-Cookie: 让 App 存储会话信息。Cache-Control: 告知 App 这份数据可以缓存多久。Server: 服务器使用的软件信息。
-
空行:分隔符。
-
响应体 (Response Body) :
最核心的部分。通常是 JSON 字符串、图片二进制数据或 HTML 源码。
3. 在 Swift 中如何映射这些结构?
当你使用 URLSession 时,这些结构被抽象成了具体的类:
| HTTP 部分 | Swift 对应的类/属性 |
|---|---|
| 整个请求 | URLRequest |
| 请求方法 | request.httpMethod |
| 请求头 | request.allHTTPHeaderFields |
| 请求主体 | request.httpBody |
| 整个响应 | HTTPURLResponse |
| 状态码 | response.statusCode |
| 响应头 | response.allHeaderFields |
代码示例:查看完整结构
Swift
let task = URLSession.shared.dataTask(with: request) { data, response, error in
// 1. 检查状态行信息
if let httpResponse = response as? HTTPURLResponse {
print("状态码: (httpResponse.statusCode)")
// 2. 查看响应头
print("服务器类型: (httpResponse.allHeaderFields["Server"] ?? "Unknown")")
}
// 3. 解析响应主体
if let data = data {
let json = try? JSONSerialization.jsonObject(with: data)
print("Body 数据: (json ?? "无数据")")
}
}
task.resume()
总结
- Headers 是关于“如何处理数据”的元数据。
- Body 是“数据本身”。
- 状态码/方法 是“动作的性质”。