使用APPLICATION_FORM_URLENCODED mediatype与Jersey客户端进行POST

时间:2013-02-19 18:08:37

标签: java java-ee jersey

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

有没有办法将对象序列化为application_form_urlencoded MultivaluedMap,或者我必须手动获取属性属性以形成结果MultivaluedMap?根据问题上下文,创建适配器以使用泽西序列化似乎不适合我。

要发布的对象

@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; }
}

使用Jersey客户端发布操作

ClientResponse response = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED).accept(MediaType.APPLICATION_JSON).post(ClientResponse.class, postableObject);

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

您可以这样做,但首先您必须基于表格(javax.ws.rs.core.Form)创建一个实体(javax.ws.rs.client.Entity),该表格映射服务所需的参数:

Form input = new Form();
input.param("first_parameter", "value");
input.param("second_parameter", "value");
Entity<Form> entity = Entity.entity(input, MediaType.APPLICATION_FORM_URLENCODED);

ClientResponse response = client.resource(url).type(MediaType.APPLICATION_FORM_URLENCODED).accept(MediaType.APPLICATION_JSON).post(entity);