GET 请求,请求正文在 OkHttp 中

2022-09-04 23:01:02

我正在尝试将OkHttp 3.6.0与Elasticsearch一起使用,但我被困在向Elasticsearch Multi GET API发送请求上。

它需要发送带有请求正文的 HTTP GET 请求。不幸的是,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 请求?

相关问题:


答案 1

经过几次尝试,我找到了这个问题的解决方案。也许有人发现它很有用。

我使用了“Httpurl.Builder”。

HttpUrl mySearchUrl = new HttpUrl.Builder()
       .scheme("https")
       .host("www.google.com")
       .addPathSegment("search")
       .addQueryParameter("q", "polar bears")
       .build();

您的获取请求 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


答案 2

从技术上讲,RFC https://www.rfc-editor.org/rfc/rfc2616#section-9.3 表示您可以在 get 请求中使用正文。

在切换到另一个客户端库之前我尝试了什么

  1. 我尝试使用网络拦截器重写请求

  2. 我尝试反射来改变方法

        Field field = originalRequest.getClass().getDeclaredField("method");
        field.setAccessible(true);
        field.set(originalRequest, "GET");
    

结论:您将需要更改库,OKHttp不支持带有请求正文的GET请求,需要使用apache客户端或任何其他支持此功能的客户端。


推荐