【问题标题】:unable to get header info form URL [duplicate]无法获取标题信息表单 URL [重复]
【发布时间】:2020-07-06 15:04:23
【问题描述】:

我正在尝试使用 Swift 5 从远程 URL 获取标头信息,但它不起作用。你能帮帮我吗?

func getHeaderInformations (myUrl: URL) -> String {
    var content= ""
    var request = URLRequest(url: myUrl)
    request.httpMethod = "HEAD"

    let task = URLSession.shared.dataTask(with: request, completionHandler: {data, response, error in
        if let reponse = response as? HTTPURLResponse {
            let contentType = reponse.allHeaderFields["Content-Type"]
            let contentLength = reponse.allHeaderFields["Content-Length"]
            content = String(describing: contentType) + "/" + String(describing: contentLength)
        }
    })
    task.resume()

    return content
}

【问题讨论】:

  • 究竟是什么不起作用?

标签: swift urlsession


【解决方案1】:

这里的问题是task 是异步执行的,所以你的getHeaderInformations 函数在content 被设置之前就退出了。 (设置content的块将在网络请求完成后的一段时间后调用。您还应该检查传递给此块的error参数,因为此时您永远不会知道是否有错误。

你基本上有两种选择:

  1. 如果您不在主线程上运行,您可以将getHeaderInformations 转换为同步的。请参阅 Can I somehow do a synchronous HTTP request via NSURLSession in Swift 了解如何执行此操作。
  2. 否则,您可以将调用getHeaderInformations 的代码也转换为异步代码。为此,您需要执行以下操作。

您在代码中的某处调用getHeaderInformations 并对结果进行处理。

 let header = getHeaderInformations(myUrl: someURL)
 // Do something with header...

相反,您将getHeaderInformation 重写为如下所示:

func getHeaderInformations (myUrl: URL, completionHandler: @escaping (_ content: String, _ error: Error?) -> Void) -> Void {
    var request = URLRequest(url: myUrl)
    request.httpMethod = "HEAD"
    let task = URLSession.shared.dataTask(with: request) {data, response, error in
        if let reponse = response as? HTTPURLResponse{
            let contentType = reponse.allHeaderFields["Content-Type"]
            let contentLength = reponse.allHeaderFields["Content-Length"]
            let content = String(describing: contentType) + "/" + String(describing: contentLength)
            completionHandler(content, error)
        }
    }
    task.resume()
}

这将添加一个完成处理程序,该处理程序将在网络请求完成时调用。然后,您可以将调用它的代码更改为如下所示:

    getHeaderInformations(myUrl: url)  { header, error in
        guard let unwrappedError = error else {
            // handle error
            return
        }
        // do something with header...
    }

注意:我在这里使用了尾随闭包语法,您在示例中没有使用。如果您不确定,请参阅Trailing Closures

【讨论】:

  • 谢谢 idz。如果它运作良好,我会试试这个并给你信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 1970-01-01
  • 2011-10-21
  • 2017-02-27
  • 2015-07-12
相关资源
最近更新 更多