Swift 4中URLSession dataTask返回nil响应且报404页面未找到求助
排查Swift 4 URLSession请求返回404的问题
看起来你遇到的核心问题很典型:Objective-C版本的请求能正常工作,但迁移到Swift 4后返回404。既然OC版本没问题,ATS配置大概率不是罪魁祸首,我们可以从请求细节的差异入手排查:
1. 核对请求核心参数与OC版本的一致性
404通常意味着服务端找不到你请求的资源,很大概率是Swift请求的某个关键参数和OC版本不符:
- 请求方法:确认Swift代码里的
method变量是否和OC版本完全一致(比如OC用POST,Swift是不是误传成了GET?)。 - 请求体编码:检查
data.toEncodedData()的实现,是不是和OC里的参数编码逻辑一致?比如OC如果是用application/x-www-form-urlencoded格式拼接参数,Swift里是不是错误地用了JSON编码?可以把OC和Swift的请求体内容打印出来对比。 - 请求头:OC版本有没有设置额外的请求头(比如
Content-Type、User-Agent)?Swift的URLRequest里有没有漏掉这些?很多服务端会严格校验Content-Type,如果缺失或不匹配,就会导致路由匹配失败。
2. 打印完整请求信息做对比
在Swift代码里,创建完urlRequest后,添加这些打印语句,把请求的所有细节输出:
print("请求方法: \(urlRequest.httpMethod ?? "未设置")") print("请求头: \(urlRequest.allHTTPHeaderFields ?? [:])") print("请求体内容: \(String(data: urlRequest.httpBody ?? Data(), encoding: .utf8) ?? "空")") print("请求URL: \(urlRequest.url?.absoluteString ?? "无效URL")")
把这些输出和OC版本的请求信息逐项对比,肯定能找到差异点——这几乎是解决这类问题最快的方式。
3. 检查URLSession代理与配置
你给URLSession设置了delegate: self,有没有实现可能修改请求的代理方法?比如urlSession(_:willPerformHTTPRedirection:newRequest:completionHandler:)如果错误地重定向了请求,也可能导致404。另外,确认URLSessionConfiguration.default的参数(比如超时时间)是否和OC版本一致,虽然这导致404的概率较低,但可以排除。
4. 最后再确认ATS配置
虽然OC版本正常,但还是快速检查下Info.plist里的ATS配置是否正确:
- 确认
NSAppTransportSecurity字典已正确添加 - 如果是针对特定域名配置,检查
NSIncludesSubdomains、NSExceptionMinimumTLSVersion等键是否设置正确,域名是否和请求的URL完全匹配
总结
最可能的原因就是Swift请求的某个细节(方法、编码、请求头)和OC版本不一致,导致服务端无法匹配到对应的接口。先通过打印请求信息对比差异,应该就能快速定位问题。
内容的提问来源于stack exchange,提问作者AK1188
相关产品推荐
相关产品推荐

