Akka:映射HttpResponse的Future以创建新的HttpRequests

时间:2017-11-01 21:50:29

标签: json scala akka akka-stream akka-http

我的目标是创建一个最终的Map [id,Result]。这里ErrorDocument 404 /missing.html AddHandler server-parsed .html # Options +FollowSymLinks +Includes RewriteEngine on # #External redirect for extensionless url RewriteCond %{THE_REQUEST} \.html #While on Localhost http://www.example.com is removed before / slash in the following RewriteRule ^(.+)\.html$ /$1 [R=301,L] # # Internal rewrite for extensionless url RewriteCond %{REQUEST_URI} !(\.[^./]+)$ RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule (.*) /$1.html [L] # 是一个案例类,如下所示:

Result

问题:我想点击一个返回JSON的API。我将解析此JSON并从整个JSON中检索所有case class Result(id: String, descr: String)字段。 member_id

(以下是我被阻止的部分,如何在Akka Streams和Http中执行此操作) 在此之后,我想为memberList列表中的每个字符串执行:

  • 1)点击一个API将member_id附加到uri。
  • 2)解析JSON以获取id和descr的列表
  • 3)返回元组memberList : List[String]

最后,将所有列表展平以获得最终List[(id, Result)]

如何正确实现以下两种方法Map[id, Result]getResult(我已经粗略地了解了我正在尝试做的事情,对我的代码进行了评论)?

以下是我的代码:

getResponse

1 个答案:

答案 0 :(得分: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] = ???

现在这当然相当迂回/冗长,但我想展示每一步的“结构” - 一旦你了解了正在发生的事情,你可以简化它。