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

Swift:URLRequest发送POST请求时JSON被作为键传入后端的问题

问题成因及修复方案

问题根源

问题出在没有给POST请求设置Content-Type请求头为application/json。

当后端接收到未指定Content-Type的请求时,通常会默认按application/x-www-form-urlencoded(表单提交格式)解析请求体。这种格式下,后端会把你发送的整个JSON字符串识别成一个表单字段的键,由于没有对应的字段值,就出现了你看到的「JSON字符串作为键、值为空」的异常结果。

修复代码

修改你的PostRequest函数,添加Content-Type请求头即可解决问题,同时建议优化URL的强制解包避免崩溃:

func PostRequest<In:Codable>(object: In, endpoint: String){
    do{
        guard let url = URL(string: "http://localhost:8080/\(endpoint)/") else {
            print("Invalid URL")
            return
        }
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        // 关键:告知后端请求体为JSON格式
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        
        request.httpBody = try JSONEncoder().encode(object)
        URLSession.shared.dataTask(with: request) {data, response, error in
            guard let data = data, error == nil else{
                print(error?.localizedDescription ?? "No Data")
                return
            }
            if let jsonResponse = try? JSONSerialization.jsonObject(with: data, options: []),
               let responseDict = jsonResponse as? [String: Any] {
                print(responseDict)
            }
        }.resume()
    }catch{
        print(error)
    }
}

额外说明

  • 设置Content-Type后,后端会明确识别请求体格式为JSON,就能正确解析你传入的结构体数据。
  • 替换url!为guard let是为了处理URL构造失败的场景(比如endpoint包含非法字符),避免触发运行时崩溃。

内容的提问来源于stack exchange,提问作者hugh19se

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:15:38