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

Swift 5 发送POST请求时服务器提示收到空请求问题求助

问题排查与修复方案

导致服务端返回空请求的核心原因

  • 未设置Content-Type请求头:POST请求提交JSON格式数据时,必须添加application/json的内容类型声明,否则服务端不会主动解析HTTP Body的JSON内容,会直接判定请求体为空
  • 未处理JSON序列化异常:当前使用try?生成JSON数据,一旦序列化失败会直接得到nil,空的请求体也会触发服务端空请求提示
  • 额外隐含问题:@Published属性属于响应式UI绑定属性,直接在URLSession的后台回调线程赋值会触发非主线程UI更新异常;且iOS默认拦截HTTP明文请求,未配置ATS的话请求会被系统直接拦截

修复后完整代码

public class Api: ObservableObject
{
    @Published var get: String = "none"

    init()
    {
        getSongs()
    }

    func getSongs()
    {
        let url = URL(string: "http://31.31.196.187:5000/search")
        
        guard let requestUrl = url else { fatalError() }
        var request = URLRequest(url: requestUrl)
        request.httpMethod = "POST"
        // 新增:声明请求体为JSON格式
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        
        let postParams:[String:Any] = [
            "song_url": "https://music.yandex.ru/album/4066489/track/33274678",
            "service": "Spotify"
        ]
        do {
            // 替换try?为do-catch处理序列化异常
            let jsonData = try JSONSerialization.data(withJSONObject: postParams, options: [])
            request.httpBody = jsonData
        } catch {
            print("JSON序列化失败: \(error.localizedDescription)")
            return
        }
        
        URLSession.shared.dataTask(with: request) { (data, response, error) in
            guard error == nil else {
                print ("请求出错: \(error!.localizedDescription)")
                return
            }
            if let data = data, let dataString = String(data: data, encoding: .utf8) {
                print("响应数据:\n \(dataString)")
                // 新增:切回主线程更新@Published属性
                DispatchQueue.main.async {
                    self.get = dataString
                }
            }
        }.resume()
    }
}

额外配置说明

如果请求被系统拦截,需要在项目的Info.plist中添加ATS配置,允许HTTP明文请求:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

内容的提问来源于stack exchange,提问作者Матвей Марюха

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:15:05