2017-02-17 28 views
1

У меня есть служба HTTP Akka, который возвращает строку, как показано ниже:Почему mapTo терпит неудачу в HTTP-клиенте Akka?

val route1: Route = { 
    path("hello") { 
     get{ 
     complete{ 
      println("Inside r1") 
      "You just accessed hello" 
     } 
     } 
    } 
} 

У меня есть клиент Akka HTTP, который пытается получить доступ к этому маршруту. Но нижеприведенный код не работает:

val future1 = Http() 
    .singleRequest(
     HttpRequest(method = HttpMethods.GET, 
     uri = "http://localhost:8187/hello")).mapTo[String] 

    future1.onSuccess({ 
    case y:String=>println(y) 
    }) 

Я не получаю никакого вывода. Но, если я использую вместо распаковать с flatMap, я получаю выход:

val future1:Future[String] = Http() 
    .singleRequest(
     HttpRequest(method = HttpMethods.GET, 
        uri = "http://localhost:8187/hello")).flatMap(resp => Unmarshal(resp).to[String]) 

Почему МАПТ неисправный здесь и почему мне нужно flatMap и распаковать?

Edit:

я понял необходимость 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 
    } 

ответ

3

смотрите документацию для 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. Больше информации об этом можно найти в docs.