从 http 编组 xml 到 json 后,Apache Camel 编码错误
Apache Camel wrong encoding after marshalling xml to json from http
我正在执行 http 调用以从拉丁美洲的 newspaper xml feed 获取 RSS 提要,然后将响应 body 转换为 JSON。
拉丁美洲报纸的问题是报纸经常发现需要编码的拉丁字符,例如 á é í ó ú
.
问题是响应编码不正确,所以我得到这样的描述:
Las lluvias llegar��an a la ciudad de C��rdoba jueves y viernes seg��n prev�� el Servicio Meteorol��gico Nacional (SMN)
我已经尝试为 http 组件和 xmljson marshal 设置编码参数,但两者都不起作用。我还尝试为 application/rss+xml; charset=utf-8
和 application/json; charset=utf-8
强制 Content-Type headers 但两者都没有。
我正在使用以下数据格式:
<dataFormats>
<xmljson id="xmljson"/>
</dataFormats>
而我的路线如下:
<route id="rss">
<from uri="direct:rss"/>
<setHeader headerName="CamelHttpUri">
<simple>"http://srvc.lavoz.com.ar/rss.xml"</simple>
</setHeader>
<setHeader headerName="CamelHttpMethod">
<constant>GET</constant>
</setHeader>
<to uri="http://rss"/>
<marshal ref="xmljson"/>
</route>
一个示例响应是:
{
"channel": {
"title": "LaVoz",
"link": "http://srvc.lavoz.com.ar/rss.xml",
"description": [],
"language": "en",
"item": [
{
"title": "��Se vienen las lluvias a C��rdoba?",
"link": "http://srvc.lavoz.com.ar/ciudadanos/se-vienen-las-lluvias-cordoba",
"description": "Las lluvias llegar��an a la ciudad de C��rdoba jueves y viernes seg��n prev�� el Servicio Meteorol��gico Nacional (SMN) aunque se mantendr�� el promedio de las temperaturas.�� Este martes estuvo cielo algo nublado con una temperatura m��nima de 14�� registrada a las 6.10 y una m��xima de 29,5�� a las 15.30, seg��n indic�� el Observatorio Meteorol��gico C��rdoba.�� Pron��stico extendido Hay probabilidad de tormentas para jueves y viernes. Mir�� el pron��stico.�� Ciudadanos",
"pubDate": "Tue, 14 Feb 2017 21:19:21 +0000",
"dc:creator": {
"@xmlns:dc": "http://purl.org/dc/elements/1.1/",
"#text": "redaccionlavoz"
},
"guid": {
"@isPermaLink": "false",
"#text": "1099119 at http://srvc.lavoz.com.ar"
}
},...
更新:
- 如果路由 returns XML 响应(没有将其编组到 JSON)编码按预期工作。
- 如果不是编组路由,而是将 body 内容和 XML 响应记录到记录器中,问题也会出现。
一位朋友在编组之前使用 UTF-8 将正文 convertBodyTo
转换为字符串,从而解决了这个问题。
结束代码如下所示:
<route id="rss">
<from uri="direct:rss"/>
<setHeader headerName="CamelHttpUri">
<simple>"http://srvc.lavoz.com.ar/rss.xml"</simple>
</setHeader>
<setHeader headerName="CamelHttpMethod">
<constant>GET</constant>
</setHeader>
<to uri="http://rss"/>
<convertBodyTo type="String" charset="UTF-8" />
<setProperty propertyName="CamelCharsetName">
<constant>utf-8</constant>
</setProperty>
<marshal ref="xmljson"/>
</route>
我正在执行 http 调用以从拉丁美洲的 newspaper xml feed 获取 RSS 提要,然后将响应 body 转换为 JSON。
拉丁美洲报纸的问题是报纸经常发现需要编码的拉丁字符,例如 á é í ó ú
.
问题是响应编码不正确,所以我得到这样的描述:
Las lluvias llegar��an a la ciudad de C��rdoba jueves y viernes seg��n prev�� el Servicio Meteorol��gico Nacional (SMN)
我已经尝试为 http 组件和 xmljson marshal 设置编码参数,但两者都不起作用。我还尝试为 application/rss+xml; charset=utf-8
和 application/json; charset=utf-8
强制 Content-Type headers 但两者都没有。
我正在使用以下数据格式:
<dataFormats>
<xmljson id="xmljson"/>
</dataFormats>
而我的路线如下:
<route id="rss">
<from uri="direct:rss"/>
<setHeader headerName="CamelHttpUri">
<simple>"http://srvc.lavoz.com.ar/rss.xml"</simple>
</setHeader>
<setHeader headerName="CamelHttpMethod">
<constant>GET</constant>
</setHeader>
<to uri="http://rss"/>
<marshal ref="xmljson"/>
</route>
一个示例响应是:
{
"channel": {
"title": "LaVoz",
"link": "http://srvc.lavoz.com.ar/rss.xml",
"description": [],
"language": "en",
"item": [
{
"title": "��Se vienen las lluvias a C��rdoba?",
"link": "http://srvc.lavoz.com.ar/ciudadanos/se-vienen-las-lluvias-cordoba",
"description": "Las lluvias llegar��an a la ciudad de C��rdoba jueves y viernes seg��n prev�� el Servicio Meteorol��gico Nacional (SMN) aunque se mantendr�� el promedio de las temperaturas.�� Este martes estuvo cielo algo nublado con una temperatura m��nima de 14�� registrada a las 6.10 y una m��xima de 29,5�� a las 15.30, seg��n indic�� el Observatorio Meteorol��gico C��rdoba.�� Pron��stico extendido Hay probabilidad de tormentas para jueves y viernes. Mir�� el pron��stico.�� Ciudadanos",
"pubDate": "Tue, 14 Feb 2017 21:19:21 +0000",
"dc:creator": {
"@xmlns:dc": "http://purl.org/dc/elements/1.1/",
"#text": "redaccionlavoz"
},
"guid": {
"@isPermaLink": "false",
"#text": "1099119 at http://srvc.lavoz.com.ar"
}
},...
更新:
- 如果路由 returns XML 响应(没有将其编组到 JSON)编码按预期工作。
- 如果不是编组路由,而是将 body 内容和 XML 响应记录到记录器中,问题也会出现。
一位朋友在编组之前使用 UTF-8 将正文 convertBodyTo
转换为字符串,从而解决了这个问题。
结束代码如下所示:
<route id="rss">
<from uri="direct:rss"/>
<setHeader headerName="CamelHttpUri">
<simple>"http://srvc.lavoz.com.ar/rss.xml"</simple>
</setHeader>
<setHeader headerName="CamelHttpMethod">
<constant>GET</constant>
</setHeader>
<to uri="http://rss"/>
<convertBodyTo type="String" charset="UTF-8" />
<setProperty propertyName="CamelCharsetName">
<constant>utf-8</constant>
</setProperty>
<marshal ref="xmljson"/>
</route>