在 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 格式放入请求体。你需要设置 httpMethod 和 httpBody。
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 参数如果包含中文或特殊字符(如
&,=),必须进行addingPercentEncoding。URLComponents会自动帮你完成这一步,这是它比字符串拼接更优雅的原因。
总结
- GET:就像在信封外面写字,大家都能看,适合查询。
- POST:就像把信塞进信封里,适合提交数据。