Swift调用REST API发送JSON报400 Bad Request问题求助
问题排查与修复方案
你的代码存在几个关键问题,直接导致了400 Bad Request错误,逐一解决如下:
1. Authorization请求头设置完全错误
你把请求头的字段名和字段值写反了。正确逻辑是:字段名为Authorization,字段值是你的授权token(多数REST API要求格式为Bearer <token>),但你现在把Authorization当成了值,字段名反而变成了token内容,服务端无法识别授权信息,直接返回错误。
修正代码:
// 安全读取token,避免强制解包崩溃 guard let tokenData = KeychainHelper.standard.read(service: "access-token", account: "store"), let token = String(data: tokenData, encoding: .utf8) else { print("无法读取授权token") return } // 正确设置Authorization头(若服务端不需要Bearer前缀,直接传token即可) request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
2. 移除危险的强制解包操作
代码中多处使用!强制解包,一旦读取失败会直接崩溃,改用可选绑定处理更安全。
3. 验证JSON格式合法性(可选但稳妥)
虽然Postman测试过JSON有效,仍可在代码中加一层验证避免潜在格式问题:
if let jsonData = jsonToPost.data(using: .utf8) { do { _ = try JSONSerialization.jsonObject(with: jsonData) print("JSON格式合法") } catch { print("JSON格式错误: \(error)") } }
完整修正后的代码
func postMobileContacts(serverURL: String, jsonToPost: String){ // 校验URL有效性 guard let requestUrl = URL(string: serverURL) else { print("无效的请求URL") return } // 构建请求对象 var request = URLRequest(url: requestUrl) request.httpMethod = "POST" // 转换JSON字符串为请求体 guard let httpBody = jsonToPost.data(using: .utf8) else { print("无法将JSON字符串转换为Data格式") return } request.httpBody = httpBody // 设置请求头 request.setValue("application/json", forHTTPHeaderField: "Accept") request.setValue("application/json", forHTTPHeaderField: "Content-Type") // 正确设置授权头 guard let tokenData = KeychainHelper.standard.read(service: "access-token", account: "store"), let token = String(data: tokenData, encoding: .utf8) else { print读取授权token失败") return } request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization") // 发起请求 let task = URLSession.shared.dataTask(with: request) { (data, response, error) in if let error = error { print("请求发生错误: \(error)") return } if let data = data, let dataString = String(data: data, encoding: .utf8) { print("响应内容:\n \(dataString)") } } task.resume() }
优先修正Authorization头的问题,这是导致400错误的核心原因——Postman中你肯定正确设置了授权头,而代码里完全搞反了字段名和值。
内容的提问来源于stack exchange,提问作者Anders
相关产品推荐
相关产品推荐

