一個Deserializer
只是在akka-http 2.4.7
爲Unmarshaller
名(同爲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
參數之三。
我以爲他們可能是一樣的。但如果是這樣,爲什麼代碼字體中的「Deserializer」:http://doc.akka.io/docs/akka/2.4.7/scala/http/routing-dsl/directives/parameter-directives/parameters.html#內容提要它意味着它是一個接口或一個自己的類。另外,我想轉換查詢參數 - > case類,與您的示例處理的HttpEntities無關。 – akauppi
瞭解,我更新了我的答案:-) –
很高興您展示了'Unmarshaller.strict'參數實際上是一個部分函數。可以使用它,它會使我的解決方案(下面)也更簡單。 – akauppi