从 1.0 移动到 2.0 时出现“application/xml”错误的 HttpEntity

HttpEntity with `application/xml` errors when moving from 1.0 to 2.0

我对 akka 的了解不多,但是 HttpEntity 处理字符串的方式有什么变化吗?

我目前正在使用 akka-http 1.0,但想升级到 2.0 并开始使用 Source.queue 功能。我正在按照 this blog 中概述的步骤进行操作,这些步骤是我从类似的 Stack Overflow 问题中获得的。我已经能够实现博客 post 中的所有内容。但是,更新到 2.0 似乎破坏了我为 HttpEntity 所做的准备。目前我在 akka-http 1.0 的 HttpRequest 中有以下声明:

entity = HttpEntity(MediaTypes.`application/xml`, xml)  

其中 xml 是使用 XStream 创建的字符串。 当我转到 2.0 时,我收到来自 IDE 的警告,它无法解析具有此类签名的 HttpEntity,并且 MediaTypes 部分存在类型不匹配;期待一个 ContentType。

尝试将 MediaType 传递给 ContentType:

HttpEntity(ContentType(MediaTypes.`application/xml`), xml)

不同类型不匹配的结果;期待 BinaryWithFixedCharset,但发现 WithOpenCharset

这是 HttpRequest for 1.0 的完整代码块,目前可以正常工作:

httpReq = HttpRequest(method = HttpMethods.PUT,
        uri = itemUri, 
        entity = HttpEntity(MediaTypes.`application/xml`, xml), 
        headers = List(apiH))

我是否需要为 2.0 的 xml 字符串实现自定义序列化器或其他东西?

非常感谢这里的任何帮助。

text/xml 内容类型必须指明字符集,以便该信息的接收者知道如何正确解析它。如果您使用的是 UTF8,那么您可以简单地使用 ContentTypes.text/xml(UTF-8) 因为它有一个固定的字符集。如果你想使用不同的字符集(比如 ISO-8859-1),那么你可以这样做:

MediaTypes.`text/xml`.withCharset(HttpCharsets.`ISO-8859-1` )

无论哪种方式,您最终都会得到 WithCharset 而不是 WithOpenCharset,因此可以在响应实体上使用它。