Swift:尝试与Web API通信时出错

时间:2014-10-08 13:52:46

标签: ios swift nsurlconnection nsurlerrordomain exc-bad-instruction

我正在尝试使用Swift构建一个非常基本的iOS应用程序 - 这是我第一次这样做。虽然其中大部分都非常直接。我有一个完整的噩梦让应用程序与我的API或任何网站交谈!

这是我正在使用的代码,特别是错误的代码:

     NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{     (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
         println(NSString(data: data, encoding: NSUTF8StringEncoding))
     })

这是'NSString(数据:数据,编码:NSUTF8StringEncoding)'错误

我经历了尽可能多的教程,他们都回答了我同样的问题。我收到一个错误说:

NSURLErrorDomain - 代码:4294966291

我也收到一个'EXC_BAD_INSTRUCTION'错误:EXC_1386_INVOP,子代码= 0x0(这还没有让我找到解决方案......

这让我觉得我在我的设置中没有做对,或者应该在我的偏好中打开一些东西,或者那些与我的代码相反的东西......

这是我的全部代码:

    var URL: NSURL = NSURL(string: "http://stackoverflow.com")

    var request:NSMutableURLRequest = NSMutableURLRequest(URL:URL)
    request.HTTPMethod = "POST"

    var bodyData = "key1=value&key2=value&key3=value"

    println(URL)
    println(bodyData)

    request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding);
    let queue:NSOperationQueue = NSOperationQueue()

    NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ (response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in
        println(NSString(data: data, encoding: NSUTF8StringEncoding))
    })

更新:

使用Rob的代码,我知道打印出错误:

  

sendAsynchronousRequest错误:错误Domain = NSURLErrorDomain Code = -1005“网络连接丢失。” UserInfo = 0x7beafcc0 {NSErrorFailingURLStringKey = http://stackoverflow.com,_ kCFStreamErrorCodeKey = 57,NSErrorFailingURLKey = http://stackoverflow.com,NSLocalizedDescription =网络连接丢失。,_ kCFStreamErrorDomainKey = 1,NSUnderlyingError = 0x7d154ca0“网络连接丢失。”} < / p>

2 个答案:

答案 0 :(得分:2)

听起来datanil。检查error对象的内容,它应该告诉您原因。最有可能的是,request出现了问题,但除非我们能够重现问题,否则很难诊断出来。

无论如何,如果您想使用更多诊断信息执行请求(如果出现问题,请记录error),如果状态代码不是200,请记录statusCoderesponse,等):

NSURLConnection.sendAsynchronousRequest(request, queue: queue) {
    response, data, error in

    if data == nil {
        println("sendAsynchronousRequest error: \(error)")
        return
    }

    if let httpResponse = response as? NSHTTPURLResponse {
        let statusCode = httpResponse.statusCode
        if statusCode != 200 {
            println("sendAsynchronousRequest status code = \(statusCode); response = \(response)")
        }
    }

    println(NSString(data: data, encoding: NSUTF8StringEncoding))
}

在修订后的问题中,您分享了结果NSError,其中报告了-1005(回想起来,与您之前展示的4294966291错误代码相同;后者是-1005)的无符号整数表示。此错误(如说明所述)适用于NSURLErrorNetworkConnectionLostkCFURLErrorNetworkConnectionLost),文档说明了这一错误,&#34;当客户端或服务器连接在中间被切断时返回-progress load。&#34;

不幸的是,此错误用于各种各样的问题,而且由于我无法重现您描述的错误,因此很难诊断。


请求中缺少的一件事是Content-Type

的规范
request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")

这不会导致您描述的问题,但总是告知服务器请求的类型是一种好的做法。

答案 1 :(得分:1)

我解决了这个问题,部分归功于Rob的答案和一般帮助 - 这非常有用。

最后的密钥非常简单,并且从这个问题中得出:Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost."

我只需要重启模拟器。但是如果没有额外的if data == nil {}语句,我就不会有。