私は次のような動作中のjsonサービスを持っています:
@POST
@Path("/{id}/query")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(JSON)
public ListWrapper query(@Context SecurityContext sc, @PathParam("id") Integer projectId, Query searchQuery) {
...
return result
}
クエリオブジェクトは次のようになり、そのクエリオブジェクトのjson表現を投稿するとうまくいきます。
@XmlRootElement
public class Query {
Integer id;
String query;
... // Getters and Setters etc..
}
次に、クライアントからそのオブジェクトを入力し、Jerseyクライアントを使用して、そのQueryオブジェクトをサービスに投稿し、結果としてJSONObjectを取得します。私の理解では、最初にjsonオブジェクトに変換してから、文字列として投稿しなくても実行できます。
私はこのようなことを試みましたが、私は何かが恋しいと思います。
public static JSONObject query(Query searchQuery){
String url = baseUrl + "project/"+searchQuery.getProjectId() +"/query";
WebResource webResource = client.resource(url);
webResource.entity(searchQuery, MediaType.APPLICATION_JSON_TYPE);
JSONObject response = webResource.post(JSONObject.class);
return response;
}
私はJersey1.12を使用しています。
正しい方向への助けやポインタがあれば大歓迎です。
WebサービスがJSONを生成する場合は、accept()
メソッドを使用してクライアントでJSONを処理する必要があります。
ClientResponse response = webResource.accept(MediaType.APPLICATION_JSON).post(searchQuery, MediaType.APPLICATION_JSON);
ListWrapper listWrapper = response.getEntity(ListWrapper.class);
これを試して、結果を出してください。
WebResource.entity(...)メソッドはwebResourceインスタンスを変更しません...変更を保持するBuilderオブジェクトを作成して返します。 .postの呼び出しは通常、WebResourceオブジェクトからではなくBuilderオブジェクトから実行されます。すべてのリクエストがチェーンされていると、その移行は簡単にわかりにくくなります。
public void sendExample(Example example) {
WebResource webResource = this.client.resource(this.url);
Builder builder = webResource.type(MediaType.APPLICATION_JSON);
builder.accept(MediaType.APPLICATION_JSON);
builder.post(Example.class, example);
return;
}
これは、チェーンを使用した同じ例です。それはまだビルダーを使用していますが、それほど明白ではありません。
public void sendExample(Example example) {
WebResource webResource = this.client.resource(this.url);
webResource.type(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.post(Example.class, example);
return;
}