我最终使用了urlsession。这是我的最终结果,对我来说很好:
enum DataFetcherErrors: Error {
case didNotRecieveData
case unknown
}
protocol DataFetching {
func getFromURL(_ url: URL, on worker: Worker) throws -> Future<Data>
}
class DataFetcher: DataFetching {
let urlSession: URLSession
private var headers = [
"Accept": "*/*",
"User-Agent": "DataFetcher",
"Cache-Control": "no-cache",
"Accept-Encoding": "gzip, deflate"
]
init(urlSession: URLSession = .shared) {
self.urlSession = urlSession
}
func getFromURL(_ url: URL, on worker: Worker) throws -> Future<Data> {
let promise = worker.eventLoop.newPromise(Data.self)
request(url: url) { (data, response, error) in
if let error = error {
promise.fail(error: error)
}
guard let data = data else {
promise.fail(error: DataFetcherErrors.didNotRecieveData)
return
}
promise.succeed(result: data)
}
return promise.futureResult
}
}
private extension DataFetcher {
func request(url: URL, completionHandler: @escaping ((Data?, URLResponse?, Error?) -> Void)) {
var request = URLRequest(url: url)
request.httpMethod = "GET"
headers.forEach { fieldName, value in
request.setValue(value, forHTTPHeaderField: fieldName)
}
let task = urlSession.dataTask(with: request, completionHandler: completionHandler)
task.resume()
}
}