2016-10-16 3 views
1

Akka HTTPを使用してパーシャルレスポンスを描画したいと考えています。リクエストでは、クライアントはレスポンスに含めるフィールドを指定する必要があります(例えば、fieldsリクエストパラメータを使用します(例:https://www.acme.com/api/users/100?fields=id,name,address)。Akka HTTPで部分応答を表示する方法

私はこれを解決するためのどのような指摘にも感謝します。

答えて

2

Akka httpは、これらのタイプの問題を解決するために、Directivesとして知られている有用なDSLを提供します。 generateResponse機能が100となどid,name,addressと呼ばれる特定の例の要求(「https://www.acme.com/api/users/100?fields=id,name,address」)について

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

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

:あなたは、特定のパスに一致して、「フィールド」キーのHttpRequestクエリ文字列を抽出することができます入力変数。あなたはいくつかの値のルックアップテーブルを持っていると言う:

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(_ + " " + _) 
    + " }" 
} 
関連する問題