与Jersey客户端的POST请求

时间:2016-01-15 15:32:45

标签: java http-headers jersey content-type url-encoding

我刚刚开始使用Jersey框架,并希望使用Jersey客户端发送HTTP请求,并将content-type设置为application/x-www-form-urlencoded

以下两个选项导致两个略有不同的请求。

// webTarget is a WebTarget instance, already configured

Form form = new Form();
form.param("some-string", "some string");
Response response1 = webTarget.request().header("Content-Type", "application/x-www-form-urlencoded").post(Entity.form(form));


Response response2 = webTarget.request(MediaType.APPLICATION_FORM_URLENCODED_TYPE).post(Entity.entity("some-string=some string, MediaType.APPLICATION_FORM_URLENCODED));

第一个选项会产生一个如下所示的正文:

some-string=some+string

第二个选项会产生一个如下所示的正文:

some-string=some string

为什么会有区别?它们应该不一样吗?

2 个答案:

答案 0 :(得分:0)

要了解发生了什么,首先需要了解处理(反)序列化的组件。对于序列化,使用MessageBodyWriter,对于反序列化,使用MessageBodyReader。您可以在JAX-RS Entity Providers了解更多信息。

据说MessageBodyWriterForm分别有Stringstripslashes(htmlspecialchars(JSON_DATA))FormProviderStringMessageProvider。前者为url-encodes the values,后者为does not

答案 1 :(得分:0)

在第二种情况下,您使用了webTarget.request()。

这是文档中关于此方法的内容:

Invocation.Builder请求(MediaType ... acceptedResponseTypes) 开始构建对目标Web资源的请求,并定义已接受的响应媒体类型

它不会对参数进行编码。