Akka-Http:在POST请求中接受application / json

时间:2016-01-08 05:03:04

标签: akka akka-http

我尝试使用circe在Akka-Http应用中进行JSON(de)序列化,而不是使用spray-json。出于这个原因,我想使用entity指令与as[String]来获取请求体的字符串表示,然后进行自己的反序列化。但似乎entity太聪明了,并且拒绝任何没有内容类型text/plain的内容。

我对文档的理解是,隐含的魔法应该让我能够做到这样的事情:

import akka.http.scaladsl.model.ContentTypes
entity(as[String].forContentTypes(ContentTypes.`application/json`))

但是编译器并没有完全推断我希望as解析为FromEntityUnmarshaller[String],它具有隐式方法forContentTypes,其结果应该转换为FromMessageUnmarshaller[String],(由于逆转)应满足FromRequestUnmarshaller[String]的需要。

但是,即使按照编译器的方式进行操作:

val jsonRequestToStringUnmarshaller: FromRequestUnmarshaller[String] = 
  messageUnmarshallerFromEntityUnmarshaller(implicitly[FromEntityUnmarshaller[String]].forContentTypes(ContentTypes.`application/json`))
entity(jsonRequestToStringUnmarshaller)

我的服务器仍然拒绝application/json次请求。

是什么给出了?

更新

我现在可以看到我误解了forContentTypes,并且它只会缩小,而不会扩展Unmarshaller接受的Content-Type范围。这只是解释了为什么我的解决方案无法正常工作。

1 个答案:

答案 0 :(得分:1)

我建议在引擎盖下使用circe给Akka-Http直接marshallers-unmarshallers /所需的类型。

可能如下所示:https://github.com/PDXostc/rvi_sota_server/blob/master/common/src/main/scala/org/genivi/sota/marshalling/CirceMarshallingSupport.scala