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

使用URLSession发起POST请求返回空,但Postman可正常获取数据

问题修复方案

核心问题原因

  • 请求头参数配置错误:当前代码的Content-Type设置为text/html,但你提交的是JSON格式的请求体,正确值应为application/json;同时Accept头写反为json/application,正确值应为application/json。服务器无法正确识别请求体格式,导致参数解析失败,返回空结果。
  • [boringssl]开头的日志为iOS 15及以上版本的系统底层默认输出,不属于业务错误,不影响请求逻辑,无需针对性修复,若需屏蔽可在Xcode运行Scheme的Environment Variables中添加OS_ACTIVITY_MODE = disable配置。

修正后的代码

var dict = [
    "queryText": query,
    "lat": "31.206865038834433",
    "long": "29.965068562105422",
    "pageToken": "",
] as [String : String]

let url = URL(string: apiEndPointURLString)!
let session = URLSession.shared

var postData = Data()
do {
    // 移除prettyPrinted选项,输出压缩格式JSON减少传输体积
    postData = try JSONSerialization.data(withJSONObject: dict, options: [])
} catch {
    print("参数序列化错误: \(error)")
}

var request = URLRequest(url: url)
request.httpMethod = "POST"
// 修正两个错误的请求头
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("application/json", forHTTPHeaderField: "Accept")
request.httpBody = postData

let task = session.dataTask(with: request) { data, response, error in
    guard let data = data, error == nil else {
        print("请求错误: \(error!)")
        return
    }
    let dataString = String(data: data, encoding: .utf8)
    print(dataString ?? "无返回数据")
}

task.resume()

补充说明

  • 无需手动设置Content-Length头,URLSession会根据httpBody的长度自动填充,手动填写反而容易出现计算错误。
  • 若修改后仍然返回空结果,可以导出Postman的完整请求头和参数配置,和代码请求的头做比对,确保鉴权等其他头字段也完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 06:06:08