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