使用 APPLICATION_FORM_URLENCODED 媒体类型与 Jersey 客户端进行 POST

jmo*_*ira 4 java jersey jakarta-ee

我必须将pojo 发布到仅通过表单数据(MediaType.APPLICATION_FORM_URLENCODED)接受参数的服务器。我知道 jersey 客户端可以将对象转换为 xml、json 和其他类型,但是尝试转换为 APPLICATION_FORM_URLENCODED 会给出一个异常,表明没有指定类型的正文编写器可用。

有没有办法将对象序列化为 application_form_urlencoded MultivaluedMap,或者我必须逐个手动获取属性以形成结果 MultivaluedMap?根据问题上下文,创建一个使用 jersey 序列化的适配器在我看来并不是合适的解决方案。

POST 对象

@XmlRootElement
public class POSTableObject {
    private int a;
    private String b;

    public int getA() { return a; }
    public void setA(int a) { this.a = a; }
    public String getB() { return b; }
    public void setB(String b) { this.b = b; }
}
Run Code Online (Sandbox Code Playgroud)

使用 Jersey 客户端发布操作

ClientResponse response = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED).accept(MediaType.APPLICATION_JSON).post(ClientResponse.class, postableObject);
Run Code Online (Sandbox Code Playgroud)

Per*_*ion 5

JAX-RS 提供者只需要提供到application/x-www-form-urlencodedfor 的映射MultivaluedMap<String,String>。而且我很确定开箱即用的 Jersey 不会提供从application/x-www-form-urlencoded到常规 POJO的额外映射器。您可以编写自己的客户端提供程序,但根据您需要这样做的频率,将 POJO 字段自己映射到 URL 字段可能更简单。

  • 如果您使用 `MultivaluedMap&lt;String, String&gt;`,JAX-RS 提供程序将自动对其进行编组。如果您使用 POJO,那么您要么必须 a) 手动将其映射到请求 b) 手动将其映射到多值映射(然后将自动编组)或 c) 编写自定义客户端消息正文编写器。 (2认同)