本文内容基本都是从官网文档整理而来,工作不易,转载请声明
创建 RestClient 后就可以通过调用 performRequest 或 performRequestAsync 发送请求。performRequest 是同步的,当请求成功时将阻塞调用线程并返回响应,如果请求失败则抛出异常。performRequestAsync 是异步的,它接受一个 ResponseListener 参数,当请求成功时,它会用一个响应调用这个参数,如果请求失败,它会用一个异常调用这个参数。
在调用方法之前需要先连接 es
// 如果 es 没有配置用户名和密码就不需要这一步 BasicCredentialsProvider provider = new BasicCredentialsProvider(); provider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("username", "password")); RestClientBuilder clientBuilder = RestClient.builder(new HttpHost(ip, port, "http")) .setHttpClientConfigCallback(httpAsyncClientBuilder -> // 同理,没有配置用户名和密码就不需要这一步 { httpAsyncClientBuilder.disableAuthCaching(); return httpAsyncClientBuilder.setDefaultCredentialsProvider(provider); }); RestClient restClient = clientBuilder.build();
可以将请求的主体设置为任何 HttpEntity。
request.setEntity(new NStringEntity( "{\"json\":\"text\"}", ContentType.APPLICATION_JSON));注意:为 HttpEntity 指定的 ContentType 很重要,因为它将用于设置内容类型头,以便 Elasticsearch 能够正确地解析内容。 另外,也可以直接设置 json 类型的 Entity。
request.setJsonEntity("{\"json\":\"text\"}");RequestOptions 类包含请求的一些部分,这些部分应该在同一个应用程序中的多个请求之间共享。你可以创建一个单例实例并在所有请求之间共享它。
addHeader 用于需要进行授权或在 Elasticsearch 前使用代理的 header,不需要设置 Content-Type 头,因为 client 将从附加到请求的 HttpEntity 自动设置它。 还可以设置 NodeSelector ,它可以控制选择哪些节点用来接收请求。NodeSelector.SKIP_DEDICATED_MASTERS 是一个不错的选择。 另外还可以定制用于缓冲异步响应的 response 使用者。默认使用者将在 JVM 堆上缓冲最多 100MB 的响应。如果响应较大,则请求将失败。例如,如果您运行在像上面示例那样的堆受限的环境中时可以降低缓冲最大值,这可能很有用。 一旦创建了单例后就可以在请求时使用了:
request.setOptions(COMMON_OPTIONS);您还可以根据每个请求定制这些选,比如这样:
RequestOptions.Builder options = COMMON_OPTIONS.toBuilder(); options.addHeader("cats", "knock things off of other things"); // 添加了一个额外的 header request.setOptions(options);