2017-02-17 4 views
1

Ich habe einen Dienst Akka HTTP, die einen String zurückgibt, wie unten dargestellt:Warum schlägt mapTo im Akka HTTP Client fehl?

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

Ich habe einen Klienten Akka HTTP, die diese Route zuzugreifen versucht. Aber der folgende Code schlägt fehl:

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

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

Ich bekomme überhaupt keine Ausgabe. Aber, wenn ich Abstellungs stattdessen mit einem flatMap verwenden, erhalte ich die Ausgabe:

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

Warum mapTo versagt hier und warum brauche ich flatMap und Abstellungs?

Edit:

ich die Notwendigkeit Unmarhsal verstanden und ich versuche, den Unterschied zwischen Karte und flatMap

Zum Beispiel zu verstehen, der folgende Code gibt mir das Ergebnis wie erwartet:

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] 
    } 

Aber, wenn ich es mit einer Karte zu ersetzen versuchen, wie unten ich die Ausgabe als 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 
    } 
erhalten

Antwort

3

Lesen Sie die Dokumentation für mapTo unter

/** 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] entspricht im Wesentlichen einem Guss. Die Http().singleRequest erzeugt eine Future[HttpResponse], und HttpResponse kann nicht unverblümt zu String gegossen werden.

Umarshalling ist erforderlich, um eine sinnvolle Logik für die Konvertierung in String anzugeben. Also in Ihrem Fall haben Sie eine implizite Unmarshaller im Umfang, die dies bietet. Und dies ist höchstwahrscheinlich der Standard stringUnmarshaller von Akka-HTTP vordefinierten Set. Weitere Informationen hierzu finden Sie in der docs.