iOS URLSession请求Authorization头丢失问题求助
针对你遇到的Authorization头在日志中存在但实际请求丢失的问题,可按以下方向排查:
1. 替换allHTTPHeaderFields为逐个设置请求头
当前代码通过request.allHTTPHeaderFields = headers一次性设置所有头,这种方式可能与URLSession的默认头逻辑冲突(比如某些系统级头的优先级更高)。建议改用setValue(_:forHTTPHeaderField:)逐个设置:
// 替换APIRequest扩展中的urlRequest方法 func urlRequest(with baseURL: URL) -> URLRequest { let url = baseURL.appendingPathComponent(path) var request = URLRequest(url: url) request.httpMethod = method // 逐个设置头,避免覆盖或冲突 headers.forEach { key, value in request.setValue(value, forHTTPHeaderField: key) } request.httpBody = body ?? encodeParameters() return request }
2. 修正APIRouter中Authorization头的赋值逻辑
你的代码中guard let token的else分支未退出,若token不存在会导致"Bearer \(token)"中token为可选值(编译层面本应报错,可能实际运行中token始终存在,但逻辑存在隐患)。修正为:
case .getAllMovies: guard let token = session.currentUserData?.token.trimmingCharacters(in: .whitespacesAndNewlines) else { print("Token missing") return headers } headers[APIHeaders.authorization] = "Bearer \(token)"
确保只有当token有效时才添加Authorization头,避免生成格式无效的头内容。
3. 检查URLSession配置与代理逻辑
- 若使用自定义
URLSessionConfiguration,确认未通过httpAdditionalHeaders设置冲突的Authorization头; - 排查是否存在自定义
URLProtocol拦截请求并修改/移除了Authorization头; - 若开启了重定向,URLSession默认可能在跨域重定向时不携带Authorization头,可通过实现
URLSessionTaskDelegate的willPerformHTTPRedirection方法,手动在重定向请求中添加该头。
4. 用抓包工具验证实际发送的请求
Xcode打印的是构建阶段的URLRequest头,但URLSession实际发送时可能会修改头信息。使用Charles、Wireshark等工具抓包,确认请求离开设备时Authorization头是否真的存在,这能区分是客户端问题还是服务器/中间件问题。
5. 排查服务器端或中间件的过滤规则
部分服务器、反向代理(如Nginx)或安全中间件会拦截或过滤Authorization头,可尝试将头名临时改为其他值(如X-Authorization)测试服务器是否能接收,若能接收则说明服务器端存在针对Authorization头的特殊处理。
内容的提问来源于stack exchange,提问作者Mzalendo
相关产品推荐
相关产品推荐

