我有带有Spring 4.3.4应用程序的JAX-RS 2.8.9。我对以下服务器代码执行了一个非常简单的POST请求
@POST
@Consumes({MediaType.APPLICATION_FORM_URLENCODED})
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response test(MultivaluedMap<String, String> work) {
return Response.ok(work.keySet().size()).build();
}
我用卷曲测试:
curl -i -X POST 'http://localhost:XXX/some/test' -d "param=value¶m2=value2" -H "Content-Type: application/x-www-form-urlencoded"
我收到以下警告
对URI http://localhost:XXX/some/test的servlet请求在请求正文中包含表单参数,但是该请求正文已被servlet或访问请求参数的servlet过滤器消耗。只有使用@FormParam的资源方法才能按预期工作。通过其他方式消耗请求主体的资源方法将无法正常工作。
我发现的唯一原因涉及连接问题,显然我没有。
根据documentation,当我们传递了可变数量的FormParams时,这是处理情况的方法。
这行得通。
@POST
@Consumes({MediaType.APPLICATION_FORM_URLENCODED})
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response test(@FormParam("param") String param) {
return Response.ok(param).build();
}
多值地图不显示的原因可能是什么?可以过滤一下吗?对于未知数量的参数,有什么替代方法?
更新 是由于Jersey + Spring的特殊性。 可以在this答案中找到解决方案。
答案 0 :(得分:0)
多值地图不显示的原因可能是什么?可以过滤一下吗?对于未知数量的参数,有什么替代方法?
默认情况下,看来您的JAX-RS实现正在检测表单输入并在对方法进行处理之前对其进行读取/处理。您是否尝试过:
@POST
@Consumes({MediaType.APPLICATION_FORM_URLENCODED})
@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
public Response test(Form workForm) {
MultivaluedMap<String,String> work = workForm.asMap();
return Response.ok(work.keySet().size()).build();
}
?
Form
是一个特殊的JAX-RS类,它封装了所有表单参数,并且可以用作方法的输入参数。