2016-07-08 6 views
2

akka-http 2.4.7 referenceはそれが中間変数に格納せずに、クエリパラメータを変換するためのカスタムDeserializer Sを行うことが可能だと述べている:intとしてパラメータ「量」のakka-httpクエリパラメータ用にカスタムデシリアライザを提供するにはどうすればよいですか?

"amount".as[Int]抽出値は、スコープ内で一致デシリアライザが必要それが機能するため(参照アンマーシャリング)が明示デシリアライザ

とパラメータ「量」の

"amount".as(deserializer)抽出値、Deserialized parameterこのページのサンプルでは、​​カスタムデシリアライザの使用方法は示されていません。

どのように定義すればいいのですか。 .as[MyType]

私はアッカソースのどこに言及しDeserializer見つけることができないので、ドキュメントは、障害があると思う:Deserializerは、アッカのドキュメントで植字されている方法についてのsearch

enter image description here

スクリーンショットを。

答えて

3

Deserializerは(akka-http 2.4.8も同じ)akka-http 2.4.7Unmarshallerのためだけの名前です

編集は:あなたはtypeという名前のクエリパラメータを抽出しているとしましょう、そしてあなたはパターン - ことができDeserializerをしたいですパラメータがStringからMyTypeに一致するようにします。

あなたのサーバーアプリでだrouteは、次のようになります。

object MyServer { 
    ... 
    // Assuming that you're requiring a 
    // `type` parameter from a `POST` request 

    import MyType._ 

    val route = 
    post { 
     parameter('type.as(myTypeDeserializer)) { myTypeValue => 
     complete { 
      // `myTypeValue` is already pattern-matched 
      // to type `MyType` here thanks to `myTypeDeserializer` 
      ... 
     } 
     } 
    } 
    ... 
} 

あなたMyTypeオブジェクトは次のようになります。

object MyType { 
    case object Type1 extends MyType 
    case object Type2 extends MyType 
    case object Type3 extends MyType 

    import akka.http.scaladsl.unmarshalling.Unmarshaller 

    // Here we pattern match the query parameter, 
    // which has type `String`, to a `MyType` 
    val stringToMyType = Unmarshaller.strict[String, MyType] { 
    case "type1" => MyType.Type1 
    case "type2" => MyType.Type2 
    case "type3" => MyType.Type3 
    } 
} 

したがってakka-httpは自動的にBadRequest応答がスローされますユーザーが未サポートを要求した場合type parame ter。

+0

私は彼らが同じかもしれないと思った。しかし、もしそうなら、なぜコードフォントに 'Deserializer'があるのですか:http://doc.akka.io/docs/akka/2.4.7/scala/http/routing-dsl/directives/parameter-directives/parameters.html#説明それはそれがインターフェイスかそれ自身のクラスであることを意味します。また、クエリパラメータ - > caseクラスを変換したいので、サンプルが扱うHttpEntitiesとは何も関係ありません。 – akauppi

+0

わかりました。私は自分の答えを更新しました:-) –

+0

'Unmarshaller.strict'パラメータが実際に部分的な関数であることを示してくれてうれしいです。それを使用することができ、私の解決策(下記)も簡単になります。 – akauppi

1

PredefinedFromStringUnmarshallers.scalaの組み込みサンプルに基づいて、カスタムクエリパラメータmarshallerを正しく宣言できました。

implicit val desId: Unmarshaller[String,Context.Id] = Unmarshaller.strict[String, Context.Id] { s => 
    Context.Id.parseOpt(s).getOrElse(
    if (s=="") throw Unmarshaller.NoContentException 
    else throw new IllegalArgumentException(s"Not a valid id: '$s'") 
) 
} 

明示的に戻り値を指定することは重要です。

+0

'if(s ==" ")'は部分関数のエントリの条件に置き換えることができます。 – akauppi

関連する問題