1

我是 REST 和球衣的新手。我使用 Jersey 1.17 API 编写了一个简单的 RESTful Web 服务。Web 服务通过 POST 方法接受数据。当我传递具有非 ascii 字符的数据时,它无法正确读取它们。

@POST
@Path("hello")  
@Consumes(MediaType.APPLICATION_FORM_URLENCODED + ";charset=UTF-8")
public Response hello(@FormParam("message") String message) {       
    System.out.println(message);        
    return Response.status(200).entity("hello" + message).build();      
}

当我在参数“消息”中传递具有非 ascii 字符的数据时,它无法正确打印。

curl --data "message=A função, Ãugent" http://localhost:8080/search/hello/

POST 方法打印“A fun??o, ?ugent”

4

1 回答 1

1

我认为泽西岛并不关心@Consumes 中定义的字符集。我猜 Jersey 只是使用 request.getParameter 方法,该方法使用请求的编码来解析参数。

您有很多选项来设置编码:

  • 如果 servlet 容器支持,请设置连接器的默认编码
  • 设置jvm的默认编码为UTF8
  • 创建一个捕获此调用的 Servlet 过滤器并调用 request.setCharacterEncoding("UTF8"); 在这种情况下,您必须确保在任何其他 getter 函数(如 getParameter)之前调用 setCharacterEncoding,因为字符编码是在请求的第一次 get 调用期间设置的。
  • 手动对参数值进行转换。您可以获取 ServletRequest 并查询编码。之后你可以说:

新字符串(message.getBytes(currentEncoding),“UTF8”);

在你的情况下,我更喜欢第三个。

于 2013-06-01T20:40:02.537 回答