【发布时间】:2018-10-24 02:44:36
【问题描述】:
服务器:带有 nodejs express 和 nginx 代理的 Ubunta。
使用我的 android 应用时一切正常。
当使用我的 iOS 应用时,我得到:
"在 /district 错误域 = NSURLErrorDomain 上调用 GET 时出错 Code=-1001 "请求超时。" UserInfo={NSUnderlyingError=0x1c0458db0 {错误 域=kCFErrorDomainCFNetwork 代码=-1001 "(null)" UserInfo={_kCFStreamErrorCodeKey=-2102, _kCFStreamErrorDomainKey=4}}, NSErrorFailingURLStringKey=http://xxx.xxx.xxx.xxx/api/district, NSErrorFailingURLKey=http://xxx.xxx.xxx.xxx/api/district, _kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-2102, NSLocalizedDescription=请求超时。}"
此错误仅在我执行 GET 请求时发生。我可以登录(POST)并将标记添加到我的地图等。一切正常。但是通过get请求获取数据却不行。
我认为问题与 iOS 6 或 7 以上的设备上的 30 秒超时/保持活动有关。它会自动设置一个标题以保持活动 30 秒。
在我的 mac localhost 服务器上工作时,我遇到了类似的问题。但是我通过发送带有 res.set("Connection", "close"); 的标头来修复它。在我的 nodejs 中路由回 iOS。像这样:
nodejs DistrictRoutes.js
router.get('/api/district', passport.authenticate('jwt', { session:false }), function(req, res, next) {
log.info("inside getting districts");
District.find({}, function(err, district) {
if (err){
res.set("Connection", "close");
log.info("error getting districts");
res.status(404).json({message:"no districts found" + err});
res.end();
}else{
res.set("Connection", "close");
log.info("success getting districts");
res.json(district);
res.end();
}
});
});
快速 iOS 应用。 httpRequester 助手类内部
func getRequest (urlPath: String, body: [String:String], success: @escaping (Data, HTTPURLResponse) -> ()) {
let token: String! = KeychainWrapper.standard.string(forKey: "token")
//check if url is a proper URL string
guard let url = URL(string: baseUrl+urlPath) else {
print("Error: cannot create URL")
return
}
var urlRequest = URLRequest(url: url)
urlRequest.httpMethod = "GET"
urlRequest.addValue("JWT " + token, forHTTPHeaderField: "Authorization")
//urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
//urlRequest.addValue("application/json", forHTTPHeaderField: "Accept")
let jsonData: Data
do {
jsonData = try JSONSerialization.data(withJSONObject: body)
urlRequest.httpBody = jsonData
} catch {
print("Error: cannot create JSON from body")
return
}
let task = URLSession.shared.dataTask(with: urlRequest) { (data: Data?, response: URLResponse?, error: Error?) in
guard error == nil else {
if let httpResponse = response as? HTTPURLResponse {
self.errorHandling(response: httpResponse)
}
print("error calling GET on /" + urlPath)
print(error!)
return
}
guard let responseData = data else {
print("Error: did not receive any data")
return
}
let httpResponse = response as! HTTPURLResponse
success(responseData, httpResponse)
}
task.resume()
}
我在当前的 ubunta 服务器上有相同的代码,如上所述,android 工作正常。在 iOS 上发布请求也是如此,但不是 GET 请求。问题出现在 iOS 设备上的展台 wifi 和 4g 连接上。
如果您还需要我帮助解决这个问题,请告诉我。
谢谢!
【问题讨论】:
-
我在发帖之前已经阅读了那篇文章。可悲的是它没有帮助我!
-
谢谢。虽然内容长度没有帮助。
-
@odd,你找到解决办法了吗?