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,提问作者Матвей Марюха
相关产品推荐
相关产品推荐

