在 iOS 中设置请求头(HTTP Headers)通常有两种粒度:针对单个请求或针对全局会话。
1. 针对单个请求设置 (最常用)
如果你只需要为某个特定的 API(如登录或上传)设置 Header,直接操作 URLRequest 对象。
- 方法:使用
setValue(_:forHTTPHeaderField:)。 - 注意:该方法会覆盖同名的旧值。如果你想在原有值基础上追加(如多个 Cookie),请使用
addValue(_:forHTTPHeaderField:)。
Swift
var request = URLRequest(url: URL(string: "https://api.example.com/user")!)
request.httpMethod = "GET"
// 设置单个 Header
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
// 设置授权 Token
request.setValue("Bearer your_token_here", forHTTPHeaderField: "Authorization")
// 也可以通过字典批量设置(会覆盖所有现有的 Headers)
// request.allHTTPHeaderFields = ["Accept": "application/json", "Custom-Header": "Value"]
2. 针对全局会话设置 (统一配置)
如果你希望 App 的每一个请求都自带某些 Header(例如 User-Agent、App-Version 或 Accept-Language),应该在初始化 URLSession 时进行配置。
- 方法:配置
URLSessionConfiguration的httpAdditionalHeaders属性。
Swift
let config = URLSessionConfiguration.default
// 设置该 Session 下所有请求都会自带的 Header
config.httpAdditionalHeaders = [
"User-Agent": "MyiOSApp/1.0",
"Accept": "application/json"
]
// 使用该配置创建 Session
let session = URLSession(configuration: config)
// 之后通过此 session 发出的所有 request 都会自动带上上述 Headers
let task = session.dataTask(with: someURL) { ... }
3. 优先级与合并规则
当你在两个地方都设置了 Header 时,遵循以下逻辑:
- 合并:如果
URLRequest和URLSessionConfiguration设置了不同的 Header,它们会合并。 - 覆盖:如果两者设置了相同名称的 Header,
URLRequest中的设置具有最高优先级,会覆盖全局配置。
4. 使用 Alamofire 设置 (第三方库)
如果你使用 Alamofire,设置 Header 会更加简洁:
Swift
let headers: HTTPHeaders = [ "Authorization": "Basic qwerty", "Accept": "application/json"]
AF.request("https://api.example.com/data", headers: headers).responseJSON { response in
// ...
}
总结
- 临时性、动态性的 Header(如 Token):设在
URLRequest。 - 固定性、全局性的 Header(如 语言、版本号):设在
URLSessionConfiguration。