Swift:尝试与 Web API 通信时出错
Posted
技术标签:
【中文标题】Swift:尝试与 Web API 通信时出错【英文标题】:Swift: error when trying to communicate with web API 【发布时间】:2014-10-08 13:52:45 【问题描述】:我正在尝试使用 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://***.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 错误:错误域=NSURLErrorDomain 代码=-1005“网络连接丢失。” UserInfo=0x7beafcc0 NSErrorFailingURLStringKey=http://***.com, _kCFStreamErrorCodeKey=57, NSErrorFailingURLKey=http://***.com, NSLocalizedDescription=网络连接丢失。, _kCFStreamErrorDomainKey=1, NSUnderlyingError=0x7d154ca0 "网络连接丢失。"
【问题讨论】:
您在发布之前更改了网址吗?以上对我有用。我总是设置Content-Type
,例如request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
,但我认为这不是问题所在。
这就是我的代码!
接下来我将使用Charles 运行它,看看响应是什么样的。
我可能还建议尝试使用不同的 URL(查看问题是否是 Stack Overflow 服务器的响应)。底线,除了缺少错误处理(您现在显然已经添加)和缺少Content-Type
之外,我看不到上述代码有任何问题。如果我们无法重现问题,则很难诊断。
好的,谢谢 Rob 的帮助!!
【参考方案1】:
听起来data
是nil
。检查error
对象的内容,它应该会告诉您原因。 request
很可能有问题,但除非我们能重现问题,否则很难诊断。
无论如何,如果你想用更多的诊断信息来执行请求(如果有问题记录error
,如果状态码不是200,记录statusCode
和response
等):
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")
这不会导致您描述的问题,但最好始终通知服务器请求的类型。
【讨论】:
谢谢 Rob,我明白了:data = (NSData!) nil - 这就是你的意思吗?【参考方案2】:我解决了这个问题,部分归功于 Rob 的回答和一般帮助 - 这非常有用。
不过,最后的关键非常简单,取自这个问题:Error Domain=NSURLErrorDomain Code=-1005 "The network connection was lost."
我只需要重新启动模拟器。但是,如果没有额外的 if data == nil 语句,我就不会到达那里。
【讨论】:
以上是关于Swift:尝试与 Web API 通信时出错的主要内容,如果未能解决你的问题,请参考以下文章
尝试将 IQKeyboardManager 与 Xcode 和 Swift 一起使用时出错
Swift 解析 Facebook Graph API 对象时出错:EXC_BAD_INSTRUCTION(code=EXC_I386_INVOP)
在 iOS 上使用 swift 使用 REST API 时出错
将 Paypal ios sdk 与 swift 5 集成时出错
尝试在 .net core web api 上运行 ASE sql (sybase) 时出错“不允许发送或接收数据的请求......”