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

Swift中带双Header的Curl风格API请求故障排查求助

Swift网络请求解码异常排查方案

一、Header设置验证

你的Header设置方式本身合法,但可以换一种方式排除服务器兼容性问题:

  • 替换urlRequest.allHTTPHeaderFields = headers为逐个添加Header:
urlRequest.httpMethod = "GET"
urlRequest.addValue("VIC", forHTTPHeaderField: "Token")
urlRequest.addValue("World", forHTTPHeaderField: "Database")
  • 确认Header键名和服务器要求完全一致(部分服务器会严格校验大小写或拼写)

二、解码无报错但结果异常的核心排查

这种情况大概率是JSON结构与LoanSelected模型不匹配,但解码器因可选属性或宽松配置未抛出错误。按以下步骤排查:

1. 打印原始响应数据

在guard let data = data else { return }后添加代码,直接查看服务器返回的JSON内容:

if let rawJson = String(data: data, encoding: .utf8) {
    print("服务器返回JSON: \(rawJson)")
}

通过打印结果确认:

  • 返回的是数组还是单个对象(当前代码按数组解码,如果是单个对象会出问题)
  • JSON键名和模型属性名是否完全对应

2. 强化错误捕获逻辑

修改解码的catch分支,打印更详细的错误信息:

do {
    let decodedUsers = try JSONDecoder().decode([LoanSelected].self, from: data)
    self.Loan = decodedUsers
} catch {
    print("解码错误: \(error)")
    if let decodeErr = error as? DecodingError {
        print("解码错误详情: \(decodeErr)")
    }
}

3. 检查模型结构

确保LoanSelected模型的属性与JSON结构匹配:

  • 如果JSON中的键名和模型属性名不一致,需添加CodingKeys枚举做映射
  • 所有非可选属性必须在JSON中有对应值,否则解码器会抛出错误(如果没抛出,说明你把属性设成了可选类型,导致空值被默认填充)

三、其他优化点

  • 放宽状态码判断:把response.statusCode == 200改成response.statusCode >= 200 && response.statusCode < 300,覆盖所有成功状态码
  • 用curl直接测试接口,确认带上指定Header后能返回正确的JSON:
curl -H "Token: VIC" -H "Database: World" https://absws.com/TmoAPI/v1/LSS.svc/GetLoan/1001

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 01:18:01