1

执行请求

一旦创建了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",  
    "/");   
restClient.performRequestAsync(request, new ResponseListener() {
    @Override
    public void onSuccess(Response response) {
        
    }

    @Override
    public void onFailure(Exception exception) {
        
    }
});
  • onSuccess方法:处理响应。
  • onFailure:处理失败。

你可以将请求参数添加到请求对象:

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

你可以将请求的body设置为任何HttpEntity

request.setEntity(new NStringEntity(
        "{\"json\":\"text\"}",
        ContentType.APPLICATION_JSON));
HttpEntity指定的ContentType很重要,因为它将用于设置Content-Type header,以便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 HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));
    COMMON_OPTIONS = builder.build();
}
  • builder.addHeader:添加所有请求所需的任何header。
  • builder.setHttpAsyncResponseConsumerFactory:自定义响应消费者。

addHeader用于授权或在Elasticsearch前使用代理所需的header,无需设置Content-Type header,因为客户端将自动从附加到请求的HttpEntity设置该header。

你可以设置NodeSelector来控制哪些节点将接收请求。

NodeSelector.NOT_MASTER_ONLY是一个不错的选择。

你还可以自定义用于缓冲异步响应的响应消费者,默认消费者将在JVM堆上缓冲最多100MB的响应,如果响应较大,则请求将失败。例如,如果你在堆约束环境(如上面的例子)中运行,则可以降低可能有用的最大大小。

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

request.setOptions(COMMON_OPTIONS);

你还可以根据请求自定义这些选项,例如,这会添加额外的header:

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();
  • onSuccess:处理返回的响应。
  • onFailure:由于通信错误或带有指示错误的状态码的响应,处理返回的异常。

上一篇:初始化
下一篇:读取响应

博弈
2.5k 声望1.5k 粉丝

态度决定一切