使用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
相关产品推荐
相关产品推荐

