将URLRequest
和URLSession.shared.dataTask
发送到POST请求到我们的NGINX Server效果很好。
我可以登录我的应用程序,但是当我尝试GET请求时,我的服务器没有该请求到达他的日志。最后,我收到超时错误。重要提示,我正在使用https。我也尝试将http用于GET请求。在NGINX服务器上,我仅将TLS设置为1.2(我不是系统专家,我在nginx cfg文件中做到了这一点。
Error Domain = NSURLErrorDomain代码= -1001“在Anforderung附近发生故障”。 UserInfo = {NSUnderlyingError = 0x60400005abe0 {Error Domain = kCFErrorDomainCFNetwork Code = -1001“(null)” UserInfo = {_ kCFStreamErrorCodeKey = -2102,_kCFStreamErrorDomainKey = 4}},NSErrorFailingURLStringKey = https://myurl,NSErrorFailingURLKey = https://myurl _kCFStreamErrorDomainKey = 4,_kCFStreamErrorCodeKey = -2102,NSLocalizedDescription =位于安福德格伦地区的Zeitüberschreitung。}
我确信URLRequest
和URLSession
的代码是正确的,因为针对localhost和我们的开发环境,我没有任何这些问题。
那是我创建我的URLRequest
private func buildUrlRequest(jsonObject:[String: Any], connectionType:ConnectionTypes, url:String) -> NSMutableURLRequest? {
let jsonDataSerialized:Data
do {
jsonDataSerialized = try JSONSerialization.data(withJSONObject: jsonObject)
} catch {
return nil
}
var request:NSMutableURLRequest
if nextData {
request = URLRequest(url: URL(string: self.nextRequestPage)!) as! NSMutableURLRequest
} else {
let tString = self.mBaseUrl + url
if let encoded = tString.addingPercentEncoding(withAllowedCharacters: .urlFragmentAllowed),
var finalurl = URL(string: encoded)
{
if connectionType == .GET {
var tString:String
tString=finalurl.absoluteString
tString = tString.replacingOccurrences(of: "https", with: "http")
finalurl = URL(string:tString)!
}
request = URLRequest(url: finalurl) as! NSMutableURLRequest
} else {
return nil
}
}
request.httpMethod = connectionType.rawValue // i am using enum here
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue("no-cache)", forHTTPHeaderField: "Cache-Control")
request.httpBody = jsonDataSerialized
if mUser != nil && mUser.getSessionId() != nil {
request.addValue("Token " + mUser.getSessionId()!, forHTTPHeaderField: "Authorization")
}
request.cachePolicy = .reloadIgnoringLocalAndRemoteCacheData
request.timeoutInterval = 30.0
return request
}
这就是我创建任务的方法...在使用task.resume()
的方法主体之后
let task = URLSession.shared.dataTask(with: request as URLRequest) { data, response, error in .... (and so on)
我花了多个小时来解决这个问题...但是我不知道。 我不确定问题是服务器配置还是Swift代码...
答案 0 :(得分:1)
主要问题是jsonObject:[String: Any]
!
我将其更改为jsonObject:[String: Any]?
在我的代码中,我为每个请求创建了正文,无论它是POST GET PUT还是其他。在GET请求中没有http-body,我再也没有问题了,没有超时!我正确地收到了预期的数据。
我还发现,仅在我的情况下,无需设置nginx或让sll_protocols加密为TLS 1.2。
我希望如果有人遇到此问题,他们会找到这篇文章:)