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
相关产品推荐
相关产品推荐

