Ann*_*hen 1 http httprequest swift
抱歉,我没有找到问题的答案((请不要太苛刻,我不是专业的程序员,但是我一直在学习,希望一旦我能够回答某人的问题,就可以))
我正在尝试获取链接的HTTP状态(我根据一种数据库条目代码(例如ABCDEF)生成链接,我将它们保留在数组中,然后生成到第二个数据库的链接,例如www.blablabla.ABCDEF.net ),这样我就可以查看该页面是否存在于数据库中。
我已经编写了这段代码,但是出了点问题。所以也许是这样的问题:“我的代码有什么问题?” 但是他们在栈上还说,您必须展示解决问题的尝试...
我希望我可以保持所有组件的快速运行,没有任何其他模块或其他东西,我认为NSHTTPURLResponse这已经足够了,但是我以某种方式使用了它。
期待帮助和回复))
var err: NSError!
NSURLConnection.sendAsynchronousRequest(request, queue: queue, completionHandler:{ (response: NSURLResponse?, data: NSData!, error: err) -> Void in
if (err != nil) {
let httpStatus: NSHTTPURLResponse = response as NSHHTPURLResponse
for myLink in allLinks {
println("HERE IS THE CURRENT STATUS CODE" + httpStatus.statusCode + "OF A LINK:" + myLink)
if httpStatus.statusCode == 200 {println("SUCCESS!!!!!")}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这里的根本问题是,你出现在被看statusCode只有当err不nil。但是,如果有错误,则可能没有状态码。闭包的错误参数表示基本的网络问题,可能阻止了您进入有问题的页面。在statusCode通常是唯一有意义的,如果误差为 nil(即你成功地连接到服务器),在这种情况下statusCode是服务器通知你自己的能力,以服务的HTTP请求如何。
一些小事:
您不需要该var err: NSError!行(因为该error对象作为参数传递给闭包)。您声明的变量在这里不使用。
我不认为error: err闭包的第三个参数可以起作用。语法为“ variableName:variableType”,但没有类型err。
同样,您的代码引用的是不存在的类NSHHTPURLResponse。在Swift 3及更高版本中,它是HTTPURLResponse。
为了获取,可能应该谨慎进行if let检索。HTTPURLResponsestatusCode
我不清楚您是否打算遍历allLinks,因为此连接仅用于给定的request,而不是一堆链接。只要看一下statusCode具体情况即可request。如果需要测试多个URL,则request对每个URL单独进行测试。
我们应该将200到299之间的任何代码视为成功,而不仅仅是200。我建议使用range 200 ..< 300。
从而:
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, let httpResponse = response as? HTTPURLResponse, error == nil else {
print("No valid response")
return
}
guard 200 ..< 300 ~= httpResponse.statusCode else {
print("Status code was \(httpResponse.statusCode), but expected 2xx")
return
}
// everything OK, process `data` here
}
task.resume()
Run Code Online (Sandbox Code Playgroud)
我还进行了其他一些更改(针对Swift 3及更高版本进行了更新;使用URLSession而不是URLConnection;我认为error变量名是不错的选择;我更喜欢尾随闭包语法;我倾向于对闭包参数使用推断类型,以使声明成为等等),但是所有这些对于手头的问题都无关紧要:希望这说明了如何检查状态码。
对于Swift 2复制,请参阅此答案的先前版本。