泽西@FormParam用x-www-form-urlencoded进行字符串编码

时间:2016-06-01 15:01:44

标签: java encoding jersey

我有一个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似乎忽略了它们。

目前也可以使用上面的解决方法,但我想确保这对泽西岛总是可以正常工作,但是我更希望有一个更安全的方式,基本上让泽西正确解释编码开始,即使这包括强制客户端以不同的方式调用我的服务(只要它意味着添加标题或其他参数)。

1 个答案:

答案 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"

完成了这项工作。