Как отображать частичные ответы с помощью Akka HTTP

Я хотел бы отобразить частичный ответ, используя Akka HTTP. В запросе клиент должен указать, какие поля включать в ответ (например, используя параметр запроса fields, например: https://www.acme.com/api/users/100?fields=id,name,address).

Я был бы признателен за любые указания о том, как решить эту проблему.


person Sebastian    schedule 16.10.2016    source источник


Ответы (1)


Akka http предоставляет полезный DSL, известный как Директивы для решения подобных проблем. Вы можете сопоставить определенный путь, а затем извлечь строку запроса HttpRequest для ключа «fields»:

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(_ + " " + _)
  + " }"
}
person Ramón J Romero y Vigil    schedule 16.10.2016