4

フォームデータ ( MediaType.APPLICATION_FORM_URLENCODED )を介してパラメーターのみを受け入れるサーバーにpojoを投稿する必要があります。jersey クライアントがオブジェクトを xml、json、およびその他のタイプに変換できることは知っていますが、APPLICATION_FORM_URLENCODED に変換しようとすると、指定されたタイプのボディ ライターが利用できないことを示す例外が発生します。

オブジェクトをシリアル化して application_form_urlencoded MultivaluedMap にする方法はありますか、または結果の MultivaluedMap を形成するために属性ごとに手動で取得する必要がありますか? jersey シリアライゼーションを使用するアダプターを作成することは、問題のコンテキストによると、適切な解決策ではないように思えます。

投稿するオブジェクト

@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);
4

2 に答える 2

5

JAX-RS プロバイダーは、 へのマッピングを提供することだけが必要application/x-www-form-urlencodedですMultivaluedMap<String,String>application/x-www-form-urlencodedそして、すぐに使える Jersey が通常の POJO への追加のマッパーを提供していないことは確かです。独自のクライアント側プロバイダーを作成することもできますが、これを行う頻度によっては、自分で POJO フィールドを URL フィールドにマップする方が簡単な場合があります。

于 2013-02-19T18:19:30.013 に答える
4

それを行うことはできますが、最初に、サービスが期待するパラメーターをマップするフォーム (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);
于 2016-07-20T09:56:44.110 に答える