我对学习Scala,Akka Streams和Akka HTTP并不陌生,因此如果问题太简单,请事先道歉。
我想在HTTP请求中执行一个HTTP请求,就像下面的代码一样:
implicit val system = ActorSystem("ActorSystem")
implicit val materializer = ActorMaterializer
import system.dispatcher
val requestHandler: Flow[HttpRequest, HttpResponse, _] = Flow[HttpRequest].map {
case HttpRequest(HttpMethods.GET, Uri.Path("/api"), _, _, _) =>
val responseFuture = Http().singleRequest(HttpRequest(uri = "http://www.google.com"))
responseFuture.onComplete {
case Success(response) =>
response.discardEntityBytes()
println(s"The request was successful")
case Failure(ex) =>
println(s"The request failed with: $ex")
}
//Await.result(responseFuture, 10 seconds)
println("Reached HttpResponse")
HttpResponse(
StatusCodes.OK, // HTTP 200
)
}
Http().bindAndHandle(requestHandler, "localhost", 8080)
但是在上述情况下,结果看起来像这样,这意味着在完成请求之前首先到达Reached HttpResponse
:
Reached HttpResponse
The request was successful
我尝试使用Await.result(responseFuture, 10 seconds)
(当前已注释掉),但没有区别。
我在这里想念什么?任何帮助将不胜感激!
非常感谢!
挑战是responseFuture
是Future
的一种。因此,您需要一个处理它的函数。该函数接受HttpRequest并返回Future of something。
HttpRequest => Future[T]
瞧,mapAsync正是您所需要的:
val requestHandler: Flow[HttpRequest, HttpResponse, _] = Flow[HttpRequest].mapAsync(2) {
case HttpRequest(HttpMethods.GET, Uri.Path("/api"), _, _, _) =>
Http().singleRequest(HttpRequest(uri = "http://www.google.com")).map (resp => {
resp.discardEntityBytes()
println(s"The request was successful")
resp
})
}