【问题标题】:Get HTTP Status using swift使用 swift 获取 HTTP 状态
【发布时间】:2014-10-25 14:52:00
【问题描述】:

对不起,我的问题没有找到答案((请不要太苛刻,我不是专业程序员,但我一直在学习,希望一旦我能够回答某人的问题))

我正在尝试获取链接的 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!!!!!")}
        }
    }
}

【问题讨论】:

    标签: http swift httprequest


    【解决方案1】:

    这里的根本问题是,只有当err 不是nil 时,您才会看到statusCode。但是如果你有错误,你可能没有状态码。闭包的错误参数表明可能阻止您访问相关页面的基本网络问题。 statusCode 通常仅在错误 nil(即您成功连接到服务器)时才有意义,在这种情况下,statusCode 是服务器通知您其能够服务 HTTP 请求。

    一些小事:

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

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

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

    4. 为了获得statusCode,使用if let 检索HTTPURLResponse 可能是谨慎的做法。

    5. 我不清楚您迭代 allLinks 的意图,因为此连接仅适用于给定的 request,而不是一堆链接。只需根据特定的request 查看statusCode。如果您需要测试多个 URL,则为每个 URL 分别设置一个 request

    6. 我们应该将 200 到 299 之间的任何代码视为成功,而不仅仅是 200。我建议使用范围 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()
    

    我还进行了一些其他更改(针对 Swift 3 及更高版本进行了更新;使用 URLSession 而不是 URLConnection;我认为 error 是变量名的好选择;我更喜欢尾随闭包语法;我倾向于为闭包参数使用推断类型以使声明更简洁等),但所有这些对于手头的问题都无关紧要:希望这说明了如何检查状态代码。

    对于 Swift 2 版本,请参阅 previous revision of this answer

    【讨论】:

    • 谢谢。我也决定不放弃,在等待某人的帮助时编写了另一个代码(工作!),但你的似乎更好,更整洁)这是我要求做的(当我自己尝试做一些可行的事情时) ): '让 urlPath: String = allLinks[i] var url: NSURL = NSURL(string: urlPath)! var request: NSURLRequest = NSURLRequest(URL: url)' 所以它一步一步地遍历数组中的每个链接并请求它们,因为这个代码本身如果在一个 for 循环中。非常感谢您的解释,我希望我能投票,但是声誉(
    【解决方案2】:

    [斯威夫特 5.2] 你好,你可以试试这个:

        let task = URLSession.shared.dataTask(with: yourRequest) {
          (data, response, error) in
          guard let response = response else {
            print("Cannot found the response")
            return
          }
          let myResponse = response as! HTTPURLResponse
          print("Status Code:", myResponse.statusCode)
        }
        task.resume()
    

    这是输出

    状态码:200

    (这是您的状态码)

    【讨论】:

      猜你喜欢
      • 2014-09-06
      • 2017-09-12
      • 2015-05-21
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      相关资源
      最近更新 更多