Почему mapTo не работает в HTTP-клиенте Akka?
У меня есть служба Akka HTTP, которая возвращает строку, как показано ниже:
val route1: Route = {
path("hello") {
get{
complete{
println("Inside r1")
"You just accessed hello"
}
}
}
}
У меня есть HTTP-клиент Akka, который пытается получить доступ к этому маршруту. Но приведенный ниже код не работает:
val future1 = Http()
.singleRequest(
HttpRequest(method = HttpMethods.GET,
uri = "http://localhost:8187/hello")).mapTo[String]
future1.onSuccess({
case y:String=>println(y)
})
Я не получаю выход вообще. Но если я использую вместо этого unmarshal с flatMap, я получаю вывод:
val future1:Future[String] = Http()
.singleRequest(
HttpRequest(method = HttpMethods.GET,
uri = "http://localhost:8187/hello")).flatMap(resp => Unmarshal(resp).to[String])
Почему mapTo не работает здесь и зачем мне flatMap и Unmarshal?
Редактировать:
Я понял необходимость Unmarhsal, и я пытаюсь понять разницу между картой и flatMap
Например, приведенный ниже код дает мне ожидаемый результат:
val future1:Future[String] = Http().singleRequest(
HttpRequest(method = HttpMethods.GET,
uri = http://localhost:8187/hello")).flatMap(testFlatFunc)
def testFlatFunc(x:HttpResponse):Future[String]={
return Unmarshal(x).to[String]
}
Но если я попытаюсь заменить его на карту, как показано ниже, я получу вывод FulfilledFuture(You just accessed hello)
val future1:Future[String] = Http()
.singleRequest(
HttpRequest(method = HttpMethods.GET,
uri = "http://localhost:8187/hello")).map(testFunc)
def testFunc(x:HttpResponse): String={
return Unmarshal(x).to[String].toString
}
1 ответ
Смотрите документы для mapTo
ниже
/** Creates a new `Future[S]` which is completed with this `Future`'s result if
* that conforms to `S`'s erased type or a `ClassCastException` otherwise.
*/
mapTo[S]
по существу, соответствует броску. Http().singleRequest
производит Future[HttpResponse]
, а также HttpResponse
не может быть прямо брошен String
,
Umarshalling необходимо указать значимую логику для преобразования в String
, Так что в вашем случае у вас есть неявное Unmarshaller
в области, которая обеспечивает это. И это, скорее всего, по умолчанию stringUnmarshaller
из предопределенного набора Akka-HTTP. Более подробную информацию об этом можно найти в документации.