我想使用Akka HTTP呈现部分响应。在请求中,客户端应指定要包含在响应中的字段(例如,使用fields
请求参数,例如:https://www.acme.com/api/users/100?fields=id,name,address
)。
我很感激有关如何解决这个问题的任何指示。
答案 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”),将使用generateResponse
和100
作为输入变量调用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(_ + " " + _)
+ " }"
}