2017-02-17 95 views
1

我有返回字符串,如以下所示的阿卡HTTP服務:爲什麼在Akka HTTP客戶端中mapTo失敗?

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

我有嘗試訪問此路線的阿卡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]) 

爲什麼mapTo失敗這裏,爲什麼我需要flatMap與解組?

編輯:

我明白了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

爲了指定一個有意義的邏輯來轉換爲String,必須使用Umarshalling。所以在你的情況下,你有一個隱含的Unmarshaller在提供這個範圍。這很可能是Akka-HTTP預定義集合的默認stringUnmarshaller。有關詳細信息,請參見docs

相關問題