服务器:带有nodejs express和nginx代理的Ubunta。
使用我的Android应用程序时,一切正常。
使用我的iOS应用程序时,我得到:
“错误调用GET on / district Error Domain = NSURLErrorDomain 代码= -1001“请求超时。” UserInfo = {NSUnderlyingError = 0x1c0458db0 {错误 Domain = kCFErrorDomainCFNetwork Code = -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)并将标记添加到我的地图等。一切正常。但通过获取请求获取数据不会。
我认为问题与在iOS 6或7上的设备上具有30秒超时/保持活动状态的iOS有关。它会自动设置一个标头以保持活动30秒。
在我的mac localhost服务器上工作时遇到了类似的问题。但我通过发送回res.set标题(“连接”,“关闭”)来修复它;在我的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();
}
});
});
swift 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连接上。
如果您需要我帮助解决此问题,请告诉我。
谢谢!
答案 0 :(得分:0)
解决方案是不发送带有GET请求的正文。 我知道它没有遵循GET的请求模式。认为有可能。
对我而言,这是糟糕的项目计划。作为开发人员,我是第一个自己的项目。所有不是秘密的识别信息都应保留在令牌中。因此,在发送获取请求时,带有令牌的标头具有过滤哪些数据发送回用户所需的所有信息。
祝你好运,希望对你有帮助!