Почему 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. Более подробную информацию об этом можно найти в документации.

Другие вопросы по тегам