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

SwiftUI新手POST API请求遇500错误及JSON解析失败求助

解决SwiftUI POST请求500错误及JSON解析失败问题

你遇到的两个问题是直接关联的:服务器返回500内部错误(HTML格式内容),导致后续尝试把HTML解析成JSON时失败,抛出NSCocoaErrorDomain Code=3840错误。以下是具体排查和修复步骤:

1. 先删掉无用代码

你的代码里有一段把User-Agent字典转成JSON字符串的逻辑,完全是多余的——HTTP头的User-Agent只需要直接设置字符串值就行,不需要转JSON。删掉这段代码减少冗余:

// 移除以下无效代码:
let userAgentHeader = ["User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148"]
        
guard let headerData = try? JSONSerialization.data(withJSONObject: userAgentHeader, options: []),
      let headerJSON = String(data: headerData, encoding: .utf8) else {
    print("Failed to convert User-Agent header dictionary to JSON string")
    return
}

2. 排查请求核心问题

服务器返回500错误,优先确认客户端请求是否符合API规范:

  • 检查URL正确性:确认传入的url变量是否指向正确的API端点,有没有拼写错误、环境(测试/生产)混淆的情况。
  • 验证请求体格式:用print(reqString)输出的请求体,核对JSON字段名是否和服务器要求完全匹配(注意大小写、下划线/驼峰格式),有没有遗漏必填字段。也可以用Postman、curl等工具发送相同请求,排除客户端代码外的问题。
  • 检查HTTP头:你已经设置了Content-Type: application/json,这是正确的,但要确认服务器是否要求其他必填头(比如Authorization、API Key等)你没添加。

3. 优化响应处理逻辑

先判断响应状态码,再决定是否解析JSON,避免无效的解析操作:

URLSession.shared.dataTask(with: request) { data, response, error in
    if let error = error {
        print("Error: \(error)")
        return
    }
    
    guard let httpResponse = response as? HTTPURLResponse else {
        print("Invalid response")
        return
    }
    
    // 先校验状态码,非2xx直接输出错误详情
    guard (200...299).contains(httpResponse.statusCode) else {
        print("Server error code: \(httpResponse.statusCode)")
        if let responseString = String(data: data ?? Data(), encoding: .utf8) {
            print("Server error content: \(responseString)")
        }
        return
    }
    
    guard let data = data else {
        print("No data received")
        return
    }
    
    // 仅在状态正常时解析JSON
    do {
        let json = try JSONSerialization.jsonObject(with: data)
        print("Response JSON: \(json)")
    } catch {
        print("Error parsing JSON: \(error)")
    }
}.resume()

额外建议

  • 用JSONDecoder配合自定义模型结构体解析响应,比JSONSerialization更类型安全,也更容易定位解析问题。
  • 用Charles或Proxyman抓包,完整查看请求的头、请求体、响应细节,这是排查API问题最直接的方式。

内容的提问来源于stack exchange,提问作者Manish kumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 09:34:58