如何使用Akka HTTP呈现部分响应

时间:2016-10-16 10:56:03

标签: akka-http

我想使用Akka HTTP呈现部分响应。在请求中,客户端应指定要包含在响应中的字段(例如,使用fields请求参数,例如:https://www.acme.com/api/users/100?fields=id,name,address)。

我很感激有关如何解决这个问题的任何指示。

1 个答案:

答案 0 :(得分:2)

Akka http提供了一个有用的DSL,称为Directives来解决这些类型的问题。您可以在特定路径上进行匹配,然后为“fields”键提取HttpRequest查询字符串:

import akka.http.scaladsl.server.Directives._

val route = get {
  path("api" / "users" / IntNumber) { pathInt =>
    parameter('fields) { fields =>
      complete(generateResponse(pathInt, fields))
    }
  }
}

对于给定的示例请求(“https://www.acme.com/api/users/100?fields=id,name,address”),将使用generateResponse100作为输入变量调用id,name,address函数。假设您有一些值的查找表:

case class Person(id : String, name : String, address : String, age : Int)

val lookupTable : Map[Int, Person] = ???

然后,您可以使用此查找表来获取此人并提取相应的字段:

def personField(person : Person)(field : String) = field match {
  case "id" => s"\"id\" = \"${person.id}\""
  case "name" => s"\"name\" = \"${person.name}\""
  ...
}

//generates JSON responses
def generateResponse(key : Int, fields : String) : String = {

  val person = lookupTable(key)

  "{ " + 
  fields
    .split(",")
    .map(personField(person))
    .reduce(_ + " " + _)
  + " }"
}