我遇到了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,当我通过POST发送请求时使用ISO-8859-1编码服务工作正常。解决方案是更改tomcat的编码。
答案 0 :(得分:1)
我刚刚发现问题的原因是tomcat,当我通过POST发送请求时,使用ISO-8859-1编码服务工作正常。我想解决方案是改变tomcat的编码。
答案 1 :(得分:0)
您的客户端似乎发送了无效请求。我怀疑您使用的是非UTF8编码,并且未在Content-Type
header中指定其名称。如果您发布完整的HTTP请求,我可以通过更多详细信息来诊断问题。
答案 2 :(得分:0)
对我来说很重要的是你没有指定@Consumes注释...尝试在你的方法上添加@Consumes(MediaType.APPLICATION_XML)
。另外,请务必发送Content-Type
并使用相应的<?xml
标记指定字符编码。
答案 3 :(得分:0)
内容类型可能是问题,但这取决于您在客户端的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