ElasticsearchでOkHttp3.6.0を使用しようとしていますが、 Elasticsearch Multi GET API にリクエストを送信できません。
リクエスト本文を使用してHTTPGETリクエストを送信する必要があります。残念ながら、OkHttpはこれをすぐにサポートしておらず、自分でリクエストを作成しようとすると例外をスローします。
RequestBody body = RequestBody.create("text/plain", "test");
// No RequestBody supported
Request request = new Request.Builder()
.url("http://example.com")
.get()
.build();
// Throws: Java.lang.IllegalArgumentException: method GET must not have a request body.
Request request = new Request.Builder()
.url("http://example.com")
.method("GET", requestBody)
.build();
OkHttpのリクエスト本文を使用してGETリクエストを作成する機会はありますか?
関連する質問:
何度か試した後、この問題の解決策を見つけました。多分誰かがそれが役に立つと思うでしょう。
「Httpurl.Builder」を利用しました。
HttpUrl mySearchUrl = new HttpUrl.Builder()
.scheme("https")
.Host("www.google.com")
.addPathSegment("search")
.addQueryParameter("q", "polar bears")
.build();
GetリクエストのURLは次のように正確に発生します。
https://www.google.com/search?q=polar%20bears
そして、URLを作成した後、次のようにリクエストを作成する必要があります。
Request request = new Request.Builder()
.url(mySearchUrl)
.addHeader("Accept", "application/json")
.method("GET", null)
.build();
ソースは次のとおりです: https://square.github.io/okhttp/3.x/okhttp/okhttp3/HttpUrl.html
私は同じことを達成しようとしましたが、残念ながら、私が個人的に演習として賞賛しているが、プロダクションコードには見たくない汚いトリックなしではそれを行うことはできません。
基本的に、ビルダーでPOSTメソッドを作成し、後でリフレクションを使用してそのメソッドフィールドを「GET」に設定できます。これでうまくいきます。
このようなもの:
Builder builder = new Request.Builder().url(mySearchUrl).method("POST", body).build();
Field field = Builder.class.getField("method");
field.setAccessible(true);
field.setValue(builder, "GET");