无法获得标题信息的形式URL

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法获得标题信息的形式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
}
答案

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

您基本上有两个选择:

  1. 如果您不在主线程上运行,则可以将getHeaderInformations转换为同步。有关如何操作,请参见Can I somehow do a synchronous HTTP request via NSURLSession in Swift
  2. 否则,您可以将调用getHeaderInformations的代码转换为异步代码。为此,您将执行以下操作。
  3. 在代码中的某个地方,您调用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

以上是关于无法获得标题信息的形式URL的主要内容,如果未能解决你的问题,请参考以下文章

如何生成URL?

在点击 microsoft Graph 的 url 时,我无法获得授权码?

无法在返回 url 中获得 paypal post pramenters

URL 片段中的多个参数

我无法从 android 的片段中读取活动中的数据库信息

Android:NullPointerException 无法将数据库加载到片段内的列表视图中