web-dev-qa-db-ja.com

REST API-入力パラメータをJava本体のオブジェクトとして持つGETメソッド

これが私の現在のREST GETメソッドです。

@GET
@Path("/URI/{input1}")
@Produces(MediaType.APPLICATION_JSON)
public List<T> getDetails(@PathParam("input1") String input1) throws ServiceException;

次に、さらに3つの入力パラメーターを追加します。 4つのパラメーターすべてをpathparamsとして追加する代わりに、4つの入力パラメーターすべてを使用してPOJOオブジェクトを作成し、そのPOJOをこのようにGETメソッドに渡すことはできますか?

@GET
@Path("/URI")
@Produces(MediaType.APPLICATION_JSON)
public List<T> getDetails(InputPojo input) throws ServiceException;

入力パラメーターを持つPOJOクラス:

class InputPojo {
    String input1;
    String input2;
    String input3;
    // Getters and Setters.
}

または、これはREST GET仕様に反しており、入力パラメーターとしてJava POJOオブジェクトを使用できませんか?

6
universe

[〜#〜] get [〜#〜]メソッドを使用したHTTPプロトコルの仕様によると、本文は指定できません。例えば。 URIの一部としてのみデータを渡すことができます。

実際には、GETメソッドを介してオブジェクトを提供できます。テキスト(JSONなど)に変換し、base64にエンコードし(スペースなどの一部の記号はURIで許可されていないため)、そのコンテンツをinput1パス変数に入れます。 (例:/URI/encodedpojohere)。次に、サーバーでinput1文字列をデコードし、JavaのPOJOに変換し直します。

このアプローチにはいくつかの制限があります(それらの中で最も明白なのは、URI文字列の長さが制限されていることです-約65535シンボルです)。そして非効率性(バイトの任意のシーケンスを送信することはできず、それらをエンコードする必要があります)。おそらく、これが、GETリクエストを介してPOJOを送信するための標準のコンバーター/アノテーション/ヘルパークラスがない理由です。したがって、[〜#〜] post [〜#〜]または[〜#〜] put [〜#代わりに〜]メソッド。 Springやその他のフレームワークには、それらのためのユーティリティクラス/アノテーションがたくさんあります。


通常、HTTPGETメソッド内で本文を指定することができます。そのようなアプローチはそこで議論されました: リクエスト本文付きのHTTP GET 。たとえば、いくつかの有名な製品 Elasticsearch は、次のようなクエリを提供します。

GET /bank/_search
{
  "query": { "match_all": {} }
}

(対応するHTTPリクエストはcurlコマンドラインユーティリティを介して実行できます)

とにかく、bodyを使用したHTTPGETは非標準です。おそらく、これがJavaでサポートされていない理由です。

4
flaz14
@Path("/injectdemo")

パブリッククラスTestClass {

//URI: http:URI/injectdemo/create?queryparam={"input1" : "XYZ", "input2" : "ABC", "input3" : "DEF"}
@GET
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@Path("/create")
public InputPojo postMsg(@QueryParam("queryparam") String jsonString) throws JsonParseException, JsonMappingException, IOException {

    //Method 1: Convert Json String to required pojo
    InputPojo inputPojo = new ObjectMapper().readValue(jsonString, InputPojo.class);

    //Method 2: Convert Json String to required pojo
    InputPojo inputPojo1 =new Gson().fromJson(jsonString, InputPojo.class);


    return inputPojo;
}

}

JSON文字列はURIで次のように送信できます:http:URI/injectdemo/create?queryparam = {"input1": "XYZ"、 "input2": "ABC"、 "input3": "DEF"}。それは私のために働いた。ただし、Pojoが正常な場合、つまり変数が多すぎる場合、Uriは長すぎるため、これは適切な方法ではありません。

0