2016-07-08 47 views
2

akka-http 2.4.7 reference指出,這是可以做到的定製Deserializer s到轉換查詢參數,而不將它們存儲在一箇中間變量:參數「量」爲Int的如何爲akka-http查詢參數提供自定義的Deserializer?

"amount".as[Int]提取物價值,你需要在範圍上匹配的解串器該工作(也見解組)具有顯式解串器

然而的參數「量」

"amount".as(deserializer)提取值,則Deserialized parameter該頁面上的示例沒有顯示如何使用自定義的反序列化器。

如何定義一個,以便我可以說,例如.as[MyType]

我認爲文件是錯誤的,因爲我無法找到阿卡來源任何地方提到Deserializer:上Deserializer是如何在阿卡文檔排版search

enter image description here

截圖。

回答

3

一個Deserializer只是在akka-http 2.4.7Unmarshaller名(同爲akka-http 2.4.8

編輯:假設你提取命名type查詢參數,以及你想要一個Deserializer,可以圖案 - 將type參數從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參數之三。

+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內置示例,我能夠聲明自定義查詢參數編組器。

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

相關問題