【问题标题】:POST requests with a Jersey client使用 Jersey 客户端的 POST 请求
【发布时间】:2016-01-15 15:32:44
【问题描述】:

我刚开始使用 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

为什么会有差异?他们应该不一样吗?

【问题讨论】:

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


    【解决方案1】:

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

    也就是说FormString 有不同的MessageBodyWriters,分别是FormProviderStringMessageProvider。前者url-encodes the values,后者does not

    【讨论】:

    • 为什么StringMessageProvider url 不对值进行编码?它将媒体类型作为参数。这是一个错误吗?
    • 因为String有很多用例,例如JSON,XML等。所有这些都可以由String处理。将字符串转换为输出流的字节很简单。它不担心试图找出数据类型。它不适用于任何特定类型。这就是不同类型提供程序的用途。
    • 不是用户期望用户如何知道的。查看采用媒体类型的 API,表明 String 支持 URL 编码。
    • 那么,如果我想对请求进行 URL 编码,我应该使用表单吗?
    • 是或多值映射
    【解决方案2】:

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

    这是文档中关于此方法的说明:

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

    它不会对参数进行编码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-16
      • 2017-05-17
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多