我在 POST 请求时遇到问题。我必须接收 XML 消息并使用 JAXB 对其进行解析。 Everithing 工作正常,但是当消息中包含特殊字符时,例如
<?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的编码。
最佳答案
内容类型可能是问题所在,但这取决于您在客户端上的 POST 中生成的内容类型以及接收端的 XML 解析器使用的字符集。
在许多此类情况下,一种可行的替代方案是在 XML 中可能出现特殊字符的地方使用 CDATA(未解析的字符数据) block 。
<sending>
<sms>
<message><![CDATA[España]]></message>
</sms>
</sending>
默认情况下,XML 解析器将尝试解析 XML 消息中的所有文本。 CDATA block 告诉 XML 解析器不要解析 CDATA block 中包含的字符。
如果接收此消息的服务无法识别该字符,则可能会出错或假设 XML 格式不正确并抛出您所看到的 400。
有关 CDATA block 的更多信息:http://www.w3schools.com/xml/xml_cdata.asp
关于使用特殊字符的 Java Restful 服务编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12532441/