这样打的电话
let jsonData = try JSONSerialization.data(withJSONObject: requestBody)
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = jsonData
let (data, response) = try await URLSession.shared.data(for: request)
当我从模拟器调用它时,它的工作完美100%的时间。
当我在手机上运行它,而在WiFi上,它的工作完美的100%的时间。
但是当我在手机网络上运行它的时候。它失败了随机。
但如果我尝试使用手机上的另一个API测试应用程序调用该端点。它的工作。
当它失败时,我得到的错误如下:
Error Domain=NSURLErrorDomain Code=-1005“网络连接丢失。“UserInfo={_kCFStreamErrorCodeKey=57,NSUnderlyingError=0x28198df50 {Error Domain=kCFErrorDomainCFNetwork Code=-1005“(null)”UserInfo={NSErorPeerAddressKey =〈CFData 0x2833f6e20 [0x1e1c79d10]〉{length = 28,capacity = 28,bytes = 0x1c1e01bbb0000000260647000020000000。.. 681 a00 aa 00000000},_kCFStreamErrorCodeKey=57,_kCFStreamErrorDomainKey=1}},_NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask .<2>,_NSURLErrorRelatedURLSessionTaskErrorKey=(“LocalDataTask .<2>“),NSLocalizedDescription=网络连接丢失。,NSErrorFailingURLStringKey=https://blahblah/v1/run,NSErrorFailingURLKey=https://blahblah/v1/run,_kCFStreamErrorDomainKey=1}
1条答案
按热度按时间vaqhlq811#
你的POST身体有多大?Hive网络有时可能非常脆弱,上传大文件时丢失连接并不罕见。
如果你要上传大块的数据,一个好的策略是改变服务器端,允许你分块上传数据,重试每个块直到成功,然后在上传完所有内容后在服务器端合并这些块。
否则,您应该问的下一个问题是是否可以使请求幂等。如果可以以这样的方式发出请求,发送两次不会造成任何伤害,那么您应该使用GET请求,以便NSURLSession机器可以在某些类型的网络故障,网络更改等之后重试请求。POST请求 * 从不 * 重试。
第三个问题是您是否使用回调覆盖了会话的任何行为。如果是这样,您确定每次都调用提供的回调吗?我看到的一些常见错误包括:
等等。任何一种情况都会导致非常奇怪的行为。
除此之外,还要查看您在设置会话和连接的方式上是否存在任何差异,包括会话配置的差异、共享缓存配置的差异、任务创建的差异、线程模型的差异等。
祝你好运