【发布时间】:2016-07-10 21:18:59
【问题描述】:
我正在使用以下 swift 代码发出 http 请求。如果服务器响应 200 OK 响应,则 swift 可以正常工作。但是,当服务器响应不是 200 状态时,completionHandler 回调永远不会被调用,直到超时。 swift上有没有其他设置可以防止收到其他状态响应?
let urlStr = "http://xxxxx"
let url = NSURL(string: urlStr)!
let request = NSMutableURLRequest(URL: url)
request.HTTPMethod = "post"
let task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: {(data, response, error) in
guard let _:NSData = data, let _:NSURLResponse = response where error == nil else {
// no response code
print("response")
return
}
print("get response from register service \(data) \(error)")
})
task.resume()
如果发生这种情况,我会在下面收到超时错误:
get login response nil error:Optional(Error Domain=NSURLErrorDomain Code=-1001 "The request timed out." UserInfo={NSErrorFailingURLStringKey=http://XXXXX, NSErrorFailingURLKey=http://localhost:8080/nurse/login, _kCFStreamErrorDomainKey=4, _kCFStreamErrorCodeKey=-2103, NSLocalizedDescription=请求超时。})
我还使用 curl 命令进行了测试,得到了如下响应。所以服务器端对我来说很好。我相信问题出在客户端。
$ curl -i -X POST -d 'mobile=1234' http://localhost:8080/nurse/login
HTTP/1.1 10029
Server: Apache-Coyote/1.1
X-Application-Context: application
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: *
Access-Control-Allow-Headers: access_token
Content-Type: text/plain;charset=UTF-8
Content-Length: 18
Date: Thu, 24 Mar 2016 02:39:09 GMT
【问题讨论】:
-
你的错误变量说明了什么?
-
它说超时。看到这个:获取登录响应零错误:可选(错误域=NSURLErrorDomain Code=-1001“请求超时。” UserInfo={NSErrorFailingURLStringKey=localhost:8080/nurse/login,NSErrorFailingURLKey=localhost:8080/nurse/login,_kCFStreamErrorDomainKey=4,_kCFStreamErrorCodeKey=-2103, NSLocalizedDescription=请求超时。})
-
您的服务器可能没有发送非 2xx 响应。
-
@diatrevolo 我已经通过浏览器和邮递员验证我的服务器确实发送了非 200 响应。
-
@user3069232:我从未听说过 NSMutableURLRequest 会消失。我刚刚读到 NSURLConnection 消失并被共享会话取代。