将 POST 请求发送到我们的 NGINX 服务器可以很好地使用URLRequest
和URLSession.shared.dataTask
。我可以登录我的应用程序,但是当我尝试 GET 请求时,我的服务器没有记录该请求到达他的日志。最后我得到超时错误。重要的是,我使用的是 https。我还尝试将 http 用于 GET 请求。在我的 NGINX 服务器上,我仅将 TLS 设置为 1.2(我不是系统专家,我是在 nginx cfg 文件中设置的。
错误域 = NSURLErrorDomain 代码 = -1001 “请求超时。” 用户信息= {NSUnderlyingError = {0x60400005abe0错误域= kCFErrorDomainCFNetwork代码= -1001 “(空)”用户信息= {_ kCFStreamErrorCodeKey = -2102,_kCFStreamErrorDomainKey = 4}},NSErrorFailingURLStringKey = https://开头myurl,NSErrorFailingURLKey = HTTPS:/ / myurl , _kCFStreamErrorDomainKey = 4, _kCFStreamErrorCodeKey = -2102, NSLocalizedDescription = 请求超时。}
我相信,我的代码URLRequest
和URLSession
是正确的,因为对本地主机和我们的开发环境,我没有任何的这些问题。
那是我创建我的代码 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 代码......
主要问题是jsonObject:[String: Any]
!我把它改成jsonObject:[String: Any]?
在我的代码中,我为每个请求创建了主体,无论它是 POST GET PUT 还是什么。如果没有 GET 请求中的 http-body,我就没有问题了,没有超时!我按预期正确接收数据。
我还发现,仅在我的情况下,没有必要设置 nginx 或让 sll_protocols 加密为 TLS 1.2。
我希望如果其他人遇到这个问题,他们会找到这篇文章:)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句