15-6.【HTTP】HTTP 请求/响应结构包含哪些部分?

3 阅读2分钟

无论请求还是响应,结构都分为三个主要部分:起始行头部 (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:状态描述(如 OKNot 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 是“数据本身”。
  • 状态码/方法 是“动作的性质”。