15-7.【HTTP】URL 中 GET 参数和 POST 参数的区别?iOS 中如何传递?

2 阅读2分钟

在 iOS 开发中,理解 GET 和 POST 参数的区别,不仅关乎代码怎么写,更关乎数据安全传输效率


1. GET 参数 vs POST 参数:核心区别

特性GET 参数 (Query Parameters)POST 参数 (Request Body)
位置附在 URL 后面(如 ?id=123放在请求体 (HTTP Body) 中
可见性明文显示在地址栏/日志中不直观可见(需抓包)
数据长度受 URL 长度限制(通常约 2KB)无理论限制(适合上传文件)
数据类型仅支持 ASCII 字符(需 URL 编码)支持 JSON、二进制、多部分表单
安全性(会被浏览器历史、CDN 日志记录)较高(配合 HTTPS 加密传输)
缓存容易被浏览器或代理服务器缓存默认不被缓存

2. 在 iOS (Swift) 中如何传递参数?

在 Swift 中使用 URLSession 时,这两种参数的处理方式完全不同。

A. 传递 GET 参数

GET 参数必须手动拼接到 URL 字符串中。推荐使用 URLComponents,因为它能自动处理特殊的 URL 编码(例如将空格转为 %20)。

Swift

// 目标:https://api.example.com/search?query=swift%20ui&limit=10
var components = URLComponents(string: "https://api.example.com/search")!

components.queryItems = [
    URLQueryItem(name: "query", value: "swift ui"),
    URLQueryItem(name: "limit", value: "10")
]

if let url = components.url {
    let request = URLRequest(url: url) // 默认就是 GET
    // 发起请求...
}

B. 传递 POST 参数

POST 参数通常以 JSON 格式放入请求体。你需要设置 httpMethodhttpBody

Swift

let url = URL(string: "https://api.example.com/login")!
var request = URLRequest(url: url)
request.httpMethod = "POST"

// 1. 设置 Content-Type 告诉服务器 Body 是 JSON
request.addValue("application/json", forHTTPHeaderField: "Content-Type")

// 2. 准备数据对象
let loginInfo = ["username": "mario", "password": "123"]
let jsonData = try? JSONSerialization.data(withJSONObject: loginInfo)

// 3. 将数据放入 Body
request.httpBody = jsonData

// 发起请求...

3. 开发中的实战建议

  • 敏感信息严禁使用 GET:密码、Token、手机号等绝不能放在 URL 里,否则会出现在服务器的访问日志(Access Log)中。
  • 搜索与筛选用 GET:这允许用户收藏当前的搜索结果 URL,或者在 App 内通过 URL 直接跳转到特定搜索页面。
  • 数据量大用 POST:如果你要发送一个长段的评论或者上传一张图片,必须使用 POST。
  • 编码问题:GET 参数如果包含中文或特殊字符(如 &, =),必须进行 addingPercentEncodingURLComponents 会自动帮你完成这一步,这是它比字符串拼接更优雅的原因。

总结

  • GET:就像在信封外面写字,大家都能看,适合查询。
  • POST:就像把信塞进信封里,适合提交数据。