执行请求编辑

创建 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,因为请求被取消了