我尝试使用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范围。这只是解释了为什么我的解决方案无法正常工作。
答案 0 :(得分:1)
我建议在引擎盖下使用circe给Akka-Http直接marshallers-unmarshallers /所需的类型。