【问题标题】:Jersey @FormParam string encoding with x-www-form-urlencodedJersey @FormParam 字符串编码与 x-www-form-urlencoded
【发布时间】:2016-06-01 15:01:43
【问题描述】:

我有一个 Jersey 2.22 REST Web 服务,我的一个端点具有以下签名:

@POST
@Path("/query")
public Response doQuery(@FormParam("query") String query) { ... }

我使用 PostMan 调用此 Web 服务,不传递特定的标头,并且在发布请求中,我将“查询”表单参数传递为“x-www-form-urlencoded”。

jersey 应用程序由 Tomcat 7 托管,该 Tomcat 7 以 JVM 编码 UTF-8、file.encoding UTF-8 启动,并且连接器的 URIEncoding 也设置为 UTF-8。

如果通过 PostMan 发送的字符串是“è”,则在调试中运行代码时,我可以看到 Jersey 以错误的编码解释了“è”字符,并且我的查询不正确执行。

如果我在方法的开头添加如下内容,一切正常:

String query2 = new String(query.getBytes("ISO-8859-1"), "UTF-8");

我查看了编码的 Forms 规范,我发现为了解码请求,客户端应该发送一个名为“charset”的隐藏参数,它将覆盖默认值(美国 ASCII),但是我尝试将此值添加为标题和 x-www-form-urlencoded 参数中的另一个条目,但泽西岛似乎忽略了它们。

目前也可以使用上述解决方法,但我想确保这对 Jersey 始终有效,但我希望有一种更安全的方法,基本上让 Jersey 从开始,即使这包括强制客户端以不同的方式调用我的服务(只要这意味着添加标头或其他参数)。

【问题讨论】:

    标签: java encoding jersey


    【解决方案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"

    完成了任务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 1970-01-01
      • 1970-01-01
      • 2015-12-13
      • 2019-01-03
      • 1970-01-01
      相关资源
      最近更新 更多