【发布时间】:2019-01-08 21:28:48
【问题描述】:
我不知道如何跟踪来自外部 URL 的重定向。我正在访问的 URL 出于某种原因给了我 301,即使我没有在邮递员中得到它。我想知道如何让 HTTPClient 跟随重定向,或者我是否做错了什么以获得 301。
我确实读过this PR,但我认为它不再相关了。 HTTPClient documentation 也不会覆盖重定向。 在下面的示例中,我将 User-Agent 设置为与 Postman 相同,以便尽可能模仿 Postman 的请求。
到目前为止我的代码:
import Vapor
import HTTP
protocol DataFetching {
func getFromURL(_ url: URL, on worker: Worker) throws -> Future<HTTPResponse>
}
class DataFetcher: DataFetching {
enum Error: Swift.Error {
case unknown
}
func getFromURL(_ url: URL, on worker: Worker) throws -> Future<HTTPResponse> {
guard let host = url.host else { throw Error.unknown }
var headers = HTTPHeaders()
headers.replaceOrAdd(name: .userAgent, value: "PostmanRuntime/7.4.0")
headers.replaceOrAdd(name: .accept, value: "*/*")
headers.replaceOrAdd(name: .cacheControl, value: "no-cache")
headers.replaceOrAdd(name: .applyToRedirectRef, value: "true")
headers.replaceOrAdd(name: .acceptEncoding, value: "gzip, deflate")
let httpRequest = HTTPRequest(method: .GET, url: url, version: HTTPVersion(major: 1, minor: 1), headers: headers)
return HTTPClient.connect(hostname: host, on: worker).flatMap { client in
return client.send(httpRequest)
}
}
}
我错过了什么?
【问题讨论】:
-
这是因为
URLRequest不遵循 301 重定向(它遵循 302)。您也许可以在您的应用服务中注册一个自定义FoundationClient实例。 -
谢谢。我最终改用
URLSession。