执行请求

编辑

创建 RestClient 后,可以通过调用 performRequestperformRequestAsync 发送请求。performRequest 是同步的,它会阻塞调用线程并在请求成功时返回 Response,如果请求失败则抛出异常。performRequestAsync 是异步的,它接受一个 ResponseListener 参数,在请求成功时用 Response 调用它,如果请求失败则用 Exception 调用它。

这是同步的

Request request = new Request(
    "GET",  
    "/");   
Response response = restClient.performRequest(request);

HTTP 方法(GETPOSTHEAD 等)

服务器上的端点

这是异步的

Request request = new Request(
    "GET",  
    "/");   
Cancellable cancellable = restClient.performRequestAsync(request,
    new ResponseListener() {
        @Override
        public void onSuccess(Response response) {
            
        }

        @Override
        public void onFailure(Exception exception) {
            
        }
});

HTTP 方法(GETPOSTHEAD 等)

服务器上的端点

处理响应

处理失败

您可以向请求对象添加请求参数

request.addParameter("pretty", "true");

您可以将请求正文设置为任何 HttpEntity

request.setEntity(new NStringEntity(
        "{\"json\":\"text\"}",
        ContentType.APPLICATION_JSON));

HttpEntity 指定的 ContentType 非常重要,因为它将用于设置 Content-Type 头,以便 Elasticsearch 可以正确解析内容。

您也可以将其设置为 String,这将默认为 ContentTypeapplication/json

request.setJsonEntity("{\"json\":\"text\"}");

RequestOptions

编辑

RequestOptions 类保存应该在同一应用程序中的许多请求之间共享的请求部分。您可以创建一个单例实例并在所有请求之间共享它。

private static final RequestOptions COMMON_OPTIONS;
static {
    RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
    builder.addHeader("Authorization", "Bearer " + TOKEN); 
    builder.setHttpAsyncResponseConsumerFactory(           
        new HttpAsyncResponseConsumerFactory
            .HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));
    COMMON_OPTIONS = builder.build();
}

添加所有请求所需的任何标头。

自定义响应使用者。

addHeader 用于授权或与 Elasticsearch 前面的代理一起工作所需的标头。无需设置 Content-Type 标头,因为客户端会根据附加到请求的 HttpEntity 自动设置它。

您可以设置 NodeSelector,它控制哪些节点将接收请求。NodeSelector.SKIP_DEDICATED_MASTERS 是一个不错的选择。

您还可以自定义用于缓冲异步响应的响应使用者。默认使用者将在 JVM 堆上缓冲最多 100MB 的响应。如果响应大于此大小,则请求将失败。例如,您可以降低最大大小,如果您在像上面示例那样的堆受限环境中运行,这可能很有用。

创建单例后,您可以在发出请求时使用它。

request.setOptions(COMMON_OPTIONS);

您也可以根据每个请求自定义这些选项。例如,这会添加一个额外的标头。

RequestOptions.Builder options = COMMON_OPTIONS.toBuilder();
options.addHeader("cats", "knock things off of other things");
request.setOptions(options);

多个并行异步操作

编辑

客户端非常乐意并行执行许多操作。下面的示例并行索引许多文档。在现实场景中,您可能更倾向于使用 _bulk API,但此示例具有说明性。

final CountDownLatch latch = new CountDownLatch(documents.length);
for (int i = 0; i < documents.length; i++) {
    Request request = new Request("PUT", "/posts/doc/" + i);
    //let's assume that the documents are stored in an HttpEntity array
    request.setEntity(documents[i]);
    restClient.performRequestAsync(
            request,
            new ResponseListener() {
                @Override
                public void onSuccess(Response response) {
                    
                    latch.countDown();
                }

                @Override
                public void onFailure(Exception exception) {
                    
                    latch.countDown();
                }
            }
    );
}
latch.await();

处理返回的响应

处理返回的异常,可能是由于通信错误或状态码指示错误的响应。

取消异步请求

编辑

performRequestAsync 方法返回一个 Cancellable,它公开一个名为 cancel 的公共方法。可以调用此方法来取消正在进行的请求。取消请求将导致通过底层 http 客户端中止 http 请求。在服务器端,这不会自动转换为取消该请求的执行,这需要在 API 本身中专门实现。

Cancellable 实例的使用是可选的,如果您不需要它,可以安全地忽略它。这的一个典型用例是将其与 Rx Java 或 Kotlin 的 suspendCancellableCoRoutine 等框架一起使用。取消不再需要的请求是避免对 Elasticsearch 施加不必要负载的好方法。

Request request = new Request("GET", "/posts/_search");
Cancellable cancellable = restClient.performRequestAsync(
    request,
    new ResponseListener() {
        @Override
        public void onSuccess(Response response) {
            
        }

        @Override
        public void onFailure(Exception exception) {
            
        }
    }
);
cancellable.cancel();

处理返回的响应,如果在请求被取消之前已准备好。

处理返回的异常,这很可能是一个 CancellationException,因为请求被取消了。