Skip to main content
 首页 » 操作系统

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

2024年01月01日44mq0036

我正在尝试使用 Swift 构建一个非常基本的 iOS 应用程序 - 这是我第一次这样做。虽然其中大部分都非常简单。让应用程序与我的 API 或任何一般网站对话,我做了一场噩梦!

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

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

错误的是'NSString(data: data, encoding: 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 error: Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost." UserInfo=0x7beafcc0 {NSErrorFailingURLStringKey=http://stackoverflow.com, _kCFStreamErrorCodeKey=57, NSErrorFailingURLKey=http://stackoverflow.com, NSLocalizedDescription=The network connection was lost., _kCFStreamErrorDomainKey=1, NSUnderlyingError=0x7d154ca0 "The network connection was lost."}

请您参考如下方法:

听起来 data 是 nil。检查 error 对象的内容,它应该会告诉您原因。 请求 很可能有问题,但除非我们可以重现该问题,否则很难诊断。

无论如何,如果你想执行带有更多诊断信息的请求(如果有问题,记录 error,记录 statusCode 和 response 如果状态代码不是 200 等):

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 的无符号整数表示)。此错误(如描述所述)是针对 NSURLErrorNetworkConnectionLost(即 kCFURLErrorNetworkConnectionLost)的,文档说,“当客户端或服务器连接在中间被切断时返回正在进行的加载。”

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


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

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

这不会导致您描述的问题,但最好始终将请求的类型告知服务器。