首页 > 解决方案 > 无法获取标题信息表单 URL

问题描述

我正在尝试使用 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
}

标签: swifturlsession

解决方案


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

你基本上有两个选择:

  1. 如果您不在主线程上运行,则可以转换getHeaderInformations为同步。请参阅我可以通过 Swift 中的 NSURLSession 以某种方式执行同步 HTTP 请求以了解如何执行此操作。
  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...
    }

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


推荐阅读