快速获取HTTP状态

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)

Rob*_*Rob 5

这里的根本问题是,你出现在被看statusCode只有当errnil。但是,如果有错误,则可能没有状态码。闭包的错误参数表示基本的网络问题,可能阻止了您进入有问题的页面。在statusCode通常是唯一有意义的,如果误差 nil(即你成功地连接到服务器),在这种情况下statusCode是服务器通知你自己的能力,以服务的HTTP请求如何。

一些小事:

  1. 您不需要该var err: NSError!行(因为该error对象作为参数传递给闭包)。您声明的变量在这里不使用。

  2. 我不认为error: err闭包的第三个参数可以起作用。语法为“ variableName:variableType”,但没有类型err

  3. 同样,您的代码引用的是不存在的类NSHHTPURLResponse。在Swift 3及更高版本中,它是HTTPURLResponse

  4. 为了获取,可能应该谨慎进行if let检索。HTTPURLResponsestatusCode

  5. 我不清楚您是否打算遍历allLinks,因为此连接仅用于给定的request,而不是一堆链接。只要看一下statusCode具体情况即可request。如果需要测试多个URL,则request对每个URL单独进行测试。

  6. 我们应该将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复制,请参阅此答案的先前版本