You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:35:15