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

如何在Swift中从API调用获取原始JSON字符串

解决URLSession获取到包含HTTP头的JSON响应问题

看起来你的服务器返回的响应格式不太标准——它把HTTP状态行、响应头和JSON响应体混在一起返回了,正常情况下URLSession会自动帮你拆分响应头(在HTTPURLResponse对象里)和响应体(就是responseData),所以这大概率是服务器端的配置问题。不过咱们可以先在客户端处理一下,拿到你需要的原始JSON字符串:

修复步骤

  1. 把responseData转换成字符串后,通过\n\n(空行)分割,因为标准HTTP响应中头和体是用空行分隔的
  2. 取分割后的第二部分,就是纯JSON内容了

下面是修改后的代码片段:

let task = URLSession.shared.dataTask(with: request) {(responseData, response, error) in
    DispatchQueue.main.async {
        guard error == nil else {
            print("ERROR: \(String(describing: error))")
            return
        }
        guard let data = responseData else {
            print("Data was not retrieved from request")
            return
        }
        
        // 把data转成字符串,然后分割出头和体
        if let fullResponseString = String(data: data, encoding: .utf8) {
            // 按空行分割,取后面的JSON部分
            let parts = fullResponseString.components(separatedBy: "\n\n")
            if parts.count >= 2 {
                let rawJsonString = parts[1]
                print("原始JSON字符串: \(rawJsonString)")
                
                // 如果需要解析JSON的话,用这个rawJsonString转回data再解析
                if let jsonData = rawJsonString.data(using: .utf8) {
                    let jsonResponse = try? JSONSerialization.jsonObject(with: jsonData, options: [])
                    if let responseDict = jsonResponse as? [String: Any] {
                        print("解析后的响应:")
                        dump(responseDict)
                    } else {
                        print("JSON格式有误")
                    }
                }
            } else {
                print("响应格式不符合预期,无法拆分")
            }
        } else {
            print("无法将响应数据转成UTF-8字符串")
        }
    }
}
task.resume()

重要提醒

虽然客户端可以临时处理,但更推荐你排查服务器端的配置——标准的HTTP响应应该由服务器将头和体分开发送,这样URLSession会自动把响应体放在responseData里,响应头可以通过response as? HTTPURLResponse获取,不需要自己手动拆分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:50:50