无法获得标题信息的形式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
参数,因为此刻您将永远不知道是否有错误。) >
您基本上有两个选择:
- 如果您不在主线程上运行,则可以将
getHeaderInformations
转换为同步。有关如何操作,请参见Can I somehow do a synchronous HTTP request via NSURLSession in Swift。 - 否则,您可以将调用
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
以上是关于无法获得标题信息的形式URL的主要内容,如果未能解决你的问题,请参考以下文章
在点击 microsoft Graph 的 url 时,我无法获得授权码?