快速HTTP请求无法获得非200响应

Joey Yi Zhao

我正在使用下面的快速代码来发出http请求。如果服务器响应为200 OK,则swift可以正常工作。但是,直到服务器响应状态为200以外的其他超时时,才会调用completeHandler回调。迅速还有其他设置可以防止收到其他状态响应吗?

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()

如果发生这种情况,我会在下面收到超时错误:

得到登录响应nil错误:可选(错误域= NSURLErrorDomain代码= -1001“请求超时。” 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
劳伦特

这似乎是服务器端的问题。以下代码有效(在Playground中):

尝试使用此网址,看看是否正在为您进行。

另外,在调试Swift代码之前,我会使用诸如curl这样的简单工具来手动测试服务器端:

curl -i -X POST -d 'name=yoyo' http://putsreq.com/vccZnwiNpP23RF7nwOPE

编辑

这是一个可以执行您想要的功能的函数。我对您的网址进行了硬编码,现在一切正常。

func postSomeStuff(data: String, completion: (data: NSData?, error: NSError?)->Void) {

    let post: NSString = "data=\(data)"
    let url = NSURL(string: "http://123.56.184.207:8080/nurse/login")!
    let postData = post.dataUsingEncoding(NSUTF8StringEncoding)!

    let postLength = String(postData.length)

    let request = NSMutableURLRequest(URL: url)
    request.HTTPMethod = "POST"
    request.HTTPBody = postData
    request.setValue(postLength, forHTTPHeaderField: "Content-Length")
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    request.setValue("*/*", forHTTPHeaderField: "Accept")

    let config = NSURLSessionConfiguration.defaultSessionConfiguration()
    config.timeoutIntervalForRequest = 120
    config.timeoutIntervalForResource = 240

    let session = NSURLSession(configuration: config)

    let task = session.dataTaskWithRequest(request) { urlData, response, reponseError in

        if let receivedData = urlData {
            let res = response as! NSHTTPURLResponse!;

            NSLog("Response code: %ld", res.statusCode);

            if 200..<300 ~= res.statusCode {
                completion(data: receivedData, error: nil)
            } else {
                let returnedError = NSError(domain: "getSomeStuff", code: 1, userInfo: [:])
                completion(data: nil, error: returnedError)
            }
        } else {
            var userInfo: [NSObject: AnyObject] = [:]
            if let error = reponseError {
                userInfo["message"] = error.localizedDescription
                userInfo["cause"] = error
            }
            let returnedError = NSError(domain: "myFunc", code: 2, userInfo: userInfo)
            completion(data: nil, error: returnedError)
        }
    }
    task.resume()
}

postSomeStuff("yoyo") { data , err in
    if let data = data { print(data) }
    if let err = err { print(err) }
}

let sema = dispatch_semaphore_create(0);
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);


// Used only in Playground
XCPSetExecutionShouldContinueIndefinitely(true)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

快速HTTP请求无法获得非200响应

来自分类Dev

非200时Angular无法获得响应

来自分类Dev

无法获得$ http响应

来自分类Dev

无法获得$ http响应

来自分类Dev

如何获得http请求的响应

来自分类Dev

无法获得 HTTP 201 响应

来自分类Dev

快速在服务器端发生异常时无法获得http响应

来自分类Dev

快速在服务器端发生异常时无法获得http响应

来自分类Dev

Wiremock - 请求 HTTPS 时无法获得响应

来自分类Dev

GAE后端-进程终止,因为它无法使用200-299或404的HTTP状态代码来响应启动请求

来自分类Dev

检查HTTP POST请求的响应是否为200

来自分类Dev

无法获得HTTP订阅确认请求

来自分类Dev

HTTP响应200 1033

来自分类Dev

200 ACT HTTP响应

来自分类Dev

为什么Python请求库无法获得响应?

来自分类Dev

使用请求库无法获得正确的响应页面

来自分类Dev

无法使用Slim Framework从PUT请求获得响应

来自分类Dev

如何获取完整的 HTTP 请求(非响应)标头

来自分类Dev

无法快速获得网址

来自分类Dev

快速发送http请求

来自分类Dev

快速响应采取请求方法

来自分类Dev

快速响应采取请求方法

来自分类Dev

使用$ http()的Angular JS获得状态为200的响应,但数据为null

来自分类Dev

通过telnet获得对简单HTTP GET请求的“ 400错误请求”响应

来自分类Dev

角度2:无法访问http请求中的响应头

来自分类Dev

无法从API接收HTTP响应-错误的请求错误

来自分类Dev

HTTP请求的响应无法从字符串转换为JSON

来自分类Dev

Nodejs HTTP 请求,无法更改响应标头

来自分类Dev

无法获得Ajax响应