2

我在 POST 请求时遇到问题。我必须接收 XML 消息并使用 JAXB 对其进行解析。一切正常,但是当消息中包含特殊字符时

<?xml version="1.0" encoding="UTF-8"?>
<sending>
    <sms>
        <message>España</message>
    </sms>
</sending>

它抛出错误请求错误(400)客户端发送的请求在语法上不正确(错误请求)。

这是我处理 xml 消息的代码

@POST
@Path("smsSendPost")
@Produces(MediaType.APPLICATION_XML)
public Response smsSendPost(JAXBElement<Sending> xml){
    Sending sending = xml.getValue();

    //Process the message
}

我使用tomcat来测试它。

谁能帮我这个?

更新:我刚刚发现问题的原因是tomcat,当我通过带有ISO-8859-1编码的POST发送请求时,服务工作正常。解决办法是改变tomcat的编码。

4

4 回答 4

1

内容类型可能是问题,但这取决于您在客户端的 POST 中生成的内容类型以及接收端的 XML 解析器使用的字符集。

在像这样的许多情况下可行的一种替代方法是在可能出现特殊字符的 XML 中使用 CDATA(未解析的字符数据)块。

<sending>
    <sms>
        <message><![CDATA[España]]></message>
    </sms>
</sending>

默认情况下,XML 解析器将尝试解析 XML 消息中的所有文本。CDATA 块告诉 XML 解析器不要解析 CDATA 块中包含的字符。

如果您的服务无法识别该字符,则可能会出错或假设 XML 格式不正确并抛出您所看到的 400。

有关 CDATA 块的更多信息:http: //www.w3schools.com/xml/xml_cdata.asp

于 2012-09-21T15:29:46.717 回答
1

我刚刚发现问题的原因是tomcat,当我通过带有ISO-8859-1编码的POST发送请求时,服务工作正常。我想解决方案是改变tomcat的编码。

于 2012-10-05T19:14:14.663 回答
0

看起来您的客户正在发送无效请求。我怀疑您使用的是一些非 UTF8 编码,并且没有在Content-Typeheader中指定其名称。如果您发布完整的 HTTP 请求,我可能能够通过更多详细信息来诊断问题。

于 2012-09-21T15:06:23.947 回答
0

让我印象深刻的是你没有指定@Consumes注释......尝试添加@Consumes(MediaType.APPLICATION_XML)你的方法。还要确保发送并具有指定字符编码Content-Type的适当标签。<?xml

于 2012-09-21T15:16:30.830 回答