これが私の現在の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オブジェクトを使用できませんか?
[〜#〜] 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でサポートされていない理由です。
@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は長すぎるため、これは適切な方法ではありません。