在 HTTP 协议中,状态码(Status Codes) 是服务器向客户端(你的 iOS App)发送的“三位数字信号”,用于告知请求的处理结果。
它们被分为五大类,每一类代表一种不同的响应性质:
1. 1xx:信息性状态码 (Informational)
含义:接收的请求正在处理。这类状态码在移动端开发中极少直接处理。
- 101 Switching Protocols:切换协议。常用于 WebSocket 连接,表示从 HTTP 升级到双向通信协议。
2. 2xx:成功状态码 (Success)
含义:请求已成功被服务器接收、理解并接受。
- 200 OK:最常见的成功状态。请求的数据在响应体中。
- 201 Created:请求成功且服务器创建了新资源(常用于
POST成功后)。 - 204 No Content:请求成功,但响应报文不包含实体主体(常用于
DELETE成功后)。
3. 3xx:重定向状态码 (Redirection)
含义:需要客户端采取进一步的操作才能完成请求。
- 301 Moved Permanently:永久重定向。旧 URL 已废弃,App 应该更新书签/链接。
- 302 Found:临时重定向。资源临时移动到了新位置。
- 304 Not Modified:非常重要。表示资源未改变,App 可以直接使用本地缓存,无需重新下载,节省流量和电量。
4. 4xx:客户端错误状态码 (Client Error)
含义:App 发送的请求有问题,服务器无法处理。
- 400 Bad Request:语义错误。通常是参数格式不对(如 JSON 拼写错误)。
- 401 Unauthorized:未授权。需要身份验证(通常是 Token 缺失或过期)。
- 403 Forbidden:拒绝访问。你有身份,但没有权限看这个资源。
- 404 Not Found:找不到资源。URL 写错了,或者资源已被删除。
- 405 Method Not Allowed:方法禁用。比如该接口只支持
POST,你却用了GET。
5. 5xx:服务器错误状态码 (Server Error)
含义:服务器在处理请求的过程中出现了错误。
- 500 Internal Server Error:服务器内部故障。通常是后端代码崩溃(如空指针异常)。
- 502 Bad Gateway:网关错误。通常是 Nginx 找不到后端的 PHP/Java 服务了。
- 503 Service Unavailable:服务不可用。服务器超载或正在维护。
- 504 Gateway Timeout:网关超时。后端处理太慢,导致前端代理断开了连接。
在 Swift 中的处理建议
在 iOS 开发中,你应该根据状态码的分组来编写逻辑,而不仅仅是判断 error == nil:
Swift
if let httpResponse = response as? HTTPURLResponse {
switch httpResponse.statusCode {
case 200...299:
print("请求成功,开始解析数据")
case 401:
print("Token 过期,跳转到登录页")
case 404:
print("资源不存在,显示空页面")
case 500...599:
print("服务器炸了,稍后再试")
default:
print("其他错误: (httpResponse.statusCode)")
}
}