2017-11-01 3 views
1

내 목표는 최종 Map [id, Result]를 만드는 것입니다.Akka : 새로운 HttpRequests를 만들기위한 HttpResponse의 미래

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

문제 : 다음 Result은 다음과 같은 경우 클래스는 내가 JSON을 반환하는 API를 치고 싶다. 이 JSON을 구문 분석하고 전체 JSON에서 모든 member_id 필드를 검색 할 것입니다.

  • 1) : memberList : List[String]

    이 후 , 내가 멤버 목록의 각 문자열을 수행 할 (아래, Akka 스트림 및 HTTP에서이 작업을 수행하는 방법을 내가에서 차단하고있어 일부) uri에 member_id를 추가하는 API를 클릭하십시오.

  • 2) 최종 얻기 위해 모든 목록을 평평하게,
  • 3) 반환 튜플 List[(id, Result)]

마지막으로 ID와 DESCR의 목록을 얻을 수있는 JSON을 구문 분석 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] = ??? 

지금 이것은 물론/오히려 로터리 자세한입니다,하지만 각 단계의 '구조'를 보여주고 싶었다 - 당신이 이해하면 당신에게 벌어지고있는 일은 그것을 많이 단순화 할 수 있습니다.

관련 문제