Scala 和 Akka HTTP:请求内部请求和线程问题
Scala and Akka HTTP: Request inside a request & issue with threads
我刚开始学习 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().bindAndHandle(requestHandler, "localhost", 8080)
但在上面的例子中,结果看起来是这样的,这意味着在完成请求之前先达到 Reached HttpResponse
:
Reached HttpResponse
The request was successful
我尝试使用 Await.result(responseFuture, 10 seconds)
(目前已被注释掉),但没有任何区别。
我在这里错过了什么?任何帮助将不胜感激!
非常感谢!
map
是一个接受请求并产生响应的函数:
HttpRequest => HttpResponse
挑战在于响应是 Future
的一种类型。因此,您需要一个处理它的函数。采用 HttpRequest 和 returns HttpResponse 的未来的函数。
HttpRequest => Future[HttpResponse]
瞧,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")
HttpResponse(StatusCodes.OK)
})
}
我刚开始学习 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().bindAndHandle(requestHandler, "localhost", 8080)
但在上面的例子中,结果看起来是这样的,这意味着在完成请求之前先达到 Reached HttpResponse
:
Reached HttpResponse
The request was successful
我尝试使用 Await.result(responseFuture, 10 seconds)
(目前已被注释掉),但没有任何区别。
我在这里错过了什么?任何帮助将不胜感激!
非常感谢!
map
是一个接受请求并产生响应的函数:
HttpRequest => HttpResponse
挑战在于响应是 Future
的一种类型。因此,您需要一个处理它的函数。采用 HttpRequest 和 returns HttpResponse 的未来的函数。
HttpRequest => Future[HttpResponse]
瞧,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")
HttpResponse(StatusCodes.OK)
})
}