执行请求
编辑执行请求编辑
创建 RestClient
后,可以通过调用 performRequest
或 performRequestAsync
发送请求。 performRequest
是同步的,它会阻塞调用线程并在请求成功时返回 Response
,或者在失败时抛出异常。 performRequestAsync
是异步的,它接受一个 ResponseListener
参数,在请求成功时使用 Response
调用它,或者在失败时使用 Exception
调用它。
这是同步的
这是异步的
Request request = new Request( "GET", "/"); Cancellable cancellable = restClient.performRequestAsync(request, new ResponseListener() { @Override public void onSuccess(Response response) { } @Override public void onFailure(Exception exception) { } });
您可以将请求参数添加到请求对象中
request.addParameter("pretty", "true");
您可以将请求的主体设置为任何 HttpEntity
request.setEntity(new NStringEntity( "{\"json\":\"text\"}", ContentType.APPLICATION_JSON));
为 HttpEntity
指定的 ContentType
很重要,因为它将用于设置 Content-Type
标头,以便 Elasticsearch 可以正确解析内容。
您也可以将其设置为 String
,它将默认设置为 ContentType
的 application/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 造成不必要负载的好方法。