2017-11-01 7 views
1

私の目的は、最終的なMap [id、Result]を作成することです。Akka:新しいHttpRequestsを作成するためのHttpResponseの将来のマップ

case class Result(id: String, descr: String)

問題:私はJSONを返すAPIを打つしたいここでResultは、以下のようにケースクラスです。このJSONを解析し、JSON全体からすべてのmember_idフィールドを取得します。

  • 1): memberList : List[String]

    はこの後 、私はメンバーリストの各文字列のためにやりたい(以下、アッカストリームとのHttpでこれを行う方法を私がブロックされてる部分です) uriへのmember_idを追加するAPIを起動します。

  • 2)idとDESCR
  • 3のリストを取得するにはJSONをパース)戻りタプルList[(id, Result)]

最後に、どのように私は正しく、次の2つのメソッドを実装することができ、最終的なMap[id, Result]

を取得するために、すべてのリストを平らにgetResultgetResponse(私がしたいことについて大まかに考えています)以下は

は私のコードです:

case class Result(id: String, descr: String) 

//// This is the Starting point of my CODE: 
private def addFeatureByTag(tag: String) : Map[String, Result] = { 

val uri = "URI to get the Memebers" 
val result = Source 
    .single(Http().singleRequest(HttpRequest(uri = uri)) 
    .map(getMembers) 
    .map(getResult) 

} 



private def getMembers(response : Future[HttpResponse]): 
Future[Source[String, NotUsed]] = { 

response.flatMap { 
    res => 
    res.status match { 
     case StatusCodes.OK => 
     Unmarshal(res.entity).to[String] map { 
      jsonOut => getAllMembers(jsonOut). //// This method return the stream of `Members` (Strings) 
     } 
    } 
    } 
} 

// How can I implement following two methods correctly `getResult` and `getResponse` 
private def getResult(member: Future[Source[String, NotUsed]]) : Future[Source[Future[HttpResponse], NotUsed]] = { 
// member.map(mem => getResponse(PREFIX + mem)) 

} 

private def getResponse(uri: Source[String, NotUsed]) = { 

// val resp = Http().singleRequest(HttpRequest(uri)) 

// resp 
} 

答えて

0

あなたが本当にここストリームを使用しますか? 「生の」先物を使用するのに十分かつ簡単になるだろうように見えます:

val root: Future[HttpResponse] = Http().singleRequest(HttpRequest(uri = uri) 
val members: Future[List[String]] = root.map(getMembers) 
val results: Future[List[(id, Future[Result])]] = members.map(ids.map(id => (id, getResult(id)))) 
val x: Future[List[Future[(id, Result)]]] = results.map(pairs.map { case (id, result) => result.map(r => (id, r))}) 
val y: Future[List[(id, Result)]]] = x.flatMap(Future.sequence) 

def getMembers(response: HttpResponse): List[String] = ??? 
def getResult(id: String): Future[Result] = ??? 

は今、これは当然のことながら、詳細/かなり遠回りですが、私は、各ステップの「構造」を見せたかった - あなたが理解すれば何が起こっているのか、それをもっと簡単にすることができます。

関連する問題