Vapor 3 - send a HTTPRequest
Your problem is .map(to: HTTPResponse.self)
. Map needs to transform its result into a new result regularly, like you would map
an array. However, the result of your map-closure returns an EventLoopFuture<HTTPResponse>
. This results in your map
function returning an EventLoopFuture<EventLoopFuture<HTTPResponse>>
.
To avoid this complexity, use flatMap
.
var headers: HTTPHeaders = .init()
let body = HTTPBody(string: a)
let httpReq = HTTPRequest(
method: .POST,
url: URL(string: "/post")!,
headers: headers,
body: body)
let client = HTTPClient.connect(hostname: "httpbin.org", on: req)
let httpRes = client.flatMap(to: HTTPResponse.self) { client in
return client.send(httpReq)
}
EDIT: If you want to use the Content APIs you can do so like this:
let data = httpRes.flatMap(to: ExampleData.self) { httpResponse in
let response = Response(http: httpResponse, using: req)
return try response.content.decode(ExampleData.self)
}
HTTPClient.connect
returns Future<HTTPClient>
and it is mapping to a Future<HTTPResponse>
not a EventLoopFuture<HTTPResponse>
.
If you're expecting a single HTTPResponse
use HttpClient.send
instead of HTTPClient.connect
.
If you're expecting multiple HTTPResponse
s then .map(to: HTTPResponse.self)
must be changed to properly map to a EventLoopFuture<HTTPResponse>