15-1.【HTTP】HTTP 请求的常用方法有哪些?请说明语义、幂等性及适用场景。

4 阅读3分钟

简单来说,幂等性是指“无论请求执行多少次,对服务器资源状态的影响都是相同的”。

以下是 Swift 开发中常用的 HTTP 方法详细对比:

常用 HTTP 方法对比表

方法语义 (Semantics)幂等性安全性常见 Swift 开发场景
GET获取资源拉取文章列表、查询用户信息
POST创建新资源提交表单、发表评论、上传新头像
PUT替换/完整更新资源更新个人资料(替换整条数据)
PATCH部分更新资源仅修改用户昵称(不触动其他字段)
DELETE删除资源注销账号、删除某条消息
HEAD仅获取响应头检查资源是否存在、检查文件大小

核心方法详解

1. GET - 获取数据

  • 语义:请求指定的页面信息,并返回实体主体。它应该是“只读”的。

  • 安全性与幂等性:它是安全的(不改变状态),也是幂等的(执行一次和一百次结果一致)。

  • Swift 场景

    Swift

    // 获取 JSON 数据
    let task = URLSession.shared.dataTask(with: url) { data, response, error in ... }
    

2. POST - 提交数据

  • 语义:向指定资源提交数据进行处理(例如提交表单或上传文件)。数据包含在请求体中。

  • 幂等性不幂等。如果重复点击“提交订单”按钮发送了两次 POST 请求,服务器可能会创建两个重复的订单。

  • Swift 场景

    Swift

    var request = URLRequest(url: url)
    request.httpMethod = "POST"
    request.httpBody = try? JSONEncoder().encode(newObject)
    

3. PUT vs PATCH - 更新数据

  • PUT (全量更新) :要求客户端提供资源的完整版本。如果资源不存在,有时也可用于创建。它是幂等的,因为多次发送相同的完整数据,结果都是那一套数据。
  • PATCH (增量更新) :仅提供需要修改的字段。它通常不幂等,例如一个 PATCH 请求的操作是 {"increment": 1},执行两次会导致数值增加 2。
  • Swift 场景:修改用户设置或更新特定的数据库记录。

4. DELETE - 删除数据

  • 语义:请求服务器删除指定的资源。
  • 幂等性:它是幂等的。第一次删除成功后,资源消失;第二次删除虽然可能返回 404 Not Found,但服务器上“该资源已不存在”的状态没有改变。

为什么幂等性在 Swift 开发中很重要?

在移动端开发(如 iOS)中,网络环境往往不稳定。了解幂等性有助于你处理自动重试机制

  1. 安全重试:对于 GETPUT 请求,如果遇到超时,网络框架可以安全地自动发起第二次请求,因为它们是幂等的,不会产生脏数据。
  2. 谨慎对待 POST:对于 POST 请求,绝对不能在未确认的情况下自动重试。否则,用户可能会被扣款两次或收到两份重复的邮件。

进阶建议

在 Swift 中,建议将这些方法封装在 enum 中以减少硬编码错误:

Swift

enum HTTPMethod: String {
    case get = "GET"
    case post = "POST"
    case put = "PUT"
    case patch = "PATCH"
    case delete = "DELETE"
}

// 使用方式
var request = URLRequest(url: url)
request.httpMethod = HTTPMethod.post.rawValue