我有一个Jersey 2.22休息网络服务,我的一个端点有以下签名:
@POST
@Path("/query")
public Response doQuery(@FormParam("query") String query) { ... }
我使用PostMan调用此Web服务时没有传递任何特定的标头,并且在post请求中我将“查询”表单param称为“x-www-form-urlencoded”。
泽西应用程序由Tomcat 7托管,它以JVM编码UTF-8,file.encoding UTF-8开头,并且连接器的URIEncoding也设置为UTF-8。
如果通过PostMan发送的字符串是“< query>è< / query>”,则在调试中运行代码时,我可以看到Jersey使用错误的编码解释“è”字符,而我的查询不是正确执行。
如果我在方法的开头添加类似的内容,那么一切正常:
String query2 = new String(query.getBytes("ISO-8859-1"), "UTF-8");
我查看了用于编码的Forms规范,我已经看到,为了解码请求,客户端应该发送一个名为“ charset ”的隐藏参数,它将覆盖默认值(US ASCII),但是我尝试将此值添加为标题和x-www-form-urlencoded参数中的另一个条目,但Jersey似乎忽略了它们。
目前也可以使用上面的解决方法,但我想确保这对泽西岛总是可以正常工作,但是我更希望有一个更安全的方式,基本上让泽西正确解释编码开始,即使这包括强制客户端以不同的方式调用我的服务(只要它意味着添加标题或其他参数)。
答案 0 :(得分:1)
解决方案是传递标题“content-type:application / x-www-form-urlencoded; charset-utf-8”,我尝试使用PostMan,但我发现,基本上,PostMan忽略了标题使用post方法并选择已经“x-www-form-urlencoded”单选按钮选项时的内容类型。
将cUrl与
一起使用 -H "content-type: application/x-www-form-urlencoded; charset=UTF-8"
完成了这项工作。