swift - 无法获取标题信息表单 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
为同步。请参阅我可以通过 Swift 中的 NSURLSession 以某种方式执行同步 HTTP 请求以了解如何执行此操作。 - 否则,您可以将调用的代码也转换
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...
}
注意:我在这里使用尾随闭包语法,您在示例中没有使用。如果您不确定,请参阅尾随闭包
推荐阅读
- python - 在 javascript 中实例化 QWebChannel 对象时的警告
- c# - 在一个键上加入两个列表,并用 CROSS 总结总数?
- android - 多个导航主机基础布局
- angular - 进行 HTTP POST 调用时出现 500(内部服务器错误)
- movesense - Movesense HelloWorld 订阅
- node.js - 在 Bot Builder 中从 URL 解析 XML 数据
- python - 在python中对一组数据执行数学运算
- python - 无法在kivy中显示进度条
- javascript - 从现有数组创建动态数组?
- vuejs2 - Element-ui $emit 在确认对话框中无效