java rest client 有两种:

1、Java Low Level REST Client :用于Elasticsearch的官方低层客户端。它允许通过http与Elasticsearch集群通信。叶子请求编组,响应反编组给用户。它兼容所有的Elasticsearch版本。

2、Java High Level REST Client :Elasticsearch的官方高级客户端。它基于底层客户端,公开API特定的方法,处理请求编组和响应反编组。

一、Java Low Level REST Client

1、先引入jar包

org.elasticsearch.client

elasticsearch-rest-client

6.6.0

2、编写代码

public classLowLevelRestClientTest {//RequestOptions类包含请求的一些部分,这些部分应该在同一个应用程序中的多个请求之间共享。你可以创建一个单实例,并在所有请求之间共享:

private static finalRequestOptions COMMON_OPTIONS;static{

RequestOptions.Builder builder=RequestOptions.DEFAULT.toBuilder();

builder.addHeader("Authorization", "kyle " + "TOKEN");

builder.setHttpAsyncResponseConsumerFactory(newHttpAsyncResponseConsumerFactory

.HeapBufferedResponseConsumerFactory(200*1024*1024));

COMMON_OPTIONS=builder.build();

}public staticRestClient buildRestClient(){//创建RestClientBuilder

RestClientBuilder builder =RestClient.builder(new HttpHost("localhost",9201,"http"),new HttpHost("localhost",9202,"http"),new HttpHost("localhost",9203,"http")

);//在创建restClient的同时,设置每个请求需要发送的默认头文件,以避免在每个请求中指定它们

Header[] defaultHeaders = new Header[]{new BasicHeader("header", "value")};

builder.setDefaultHeaders(defaultHeaders);//设置应该遵守的超时,以防对同一个请求进行多次尝试,默认为3000ms.

builder.setMaxRetryTimeoutMillis(1000);//设置一个监听器,用来在节点发生故障的时候,采取相应的操作。

builder.setFailureListener(newRestClient.FailureListener(){

@Overridepublic voidonFailure(Node node) {super.onFailure(node);//doSomeThing();

}

});//将节点选择器设置为用于过滤客户机将发送请求到的节点之间的节点,这些节点被设置为客户机本身。//这对于防止在启用嗅探时将请求发送到专用的主节点非常有用。默认情况下,客户机向每个配置的节点发送请求

builder.setNodeSelector(NodeSelector.SKIP_DEDICATED_MASTERS);//设置一个回调函数,允许修改默认的请求配置

/*builder.setRequestConfigCallback(new RestClientBuilder.RequestConfigCallback() {

@Override

public Builder customizeRequestConfig(Builder arg0) {

return null;

}

});*/

//设置一个回调,允许修改http客户机配置

/*builder.setHttpClientConfigCallback(new HttpClientConfigCallback(){

@Override

public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder arg0) {

return null;

}

});*/

//创建restClient,中间的那些配置也可以不设置

RestClient restClient =builder.build();returnrestClient;

}public static void request(RestClient restClient) throwsParseException, IOException{//创建一个请求组

Request request = new Request("GET","/_search");//为请求添加一些参数

request.addParameter("pretty", "true");//请求的主体设置为任何HttpEntity,//为HttpEntity指定的ContentType非常重要,因为它将用于设置content - type头部,以便Elasticsearch能够正确解析内容。//request.setEntity(new NStringEntity("{\"json\":\"text\"}",ContentType.APPLICATION_JSON));//还可以将其设置为一个字符串,该字符串将默认为application/json的ContentType。

request.setJsonEntity("{\"query\": {\"match\": {\"address\": \"Street\"}}}");//非必须

request.setOptions(COMMON_OPTIONS);//发送一个同步的请求,线程会阻塞

Response response =restClient.performRequest(request);//发送异步请求,然后使用监听器来对返回结果进行处理

/*restClient.performRequestAsync(request, new ResponseListener() {

@Override

public void onSuccess(Response resp) {

System.out.println("成功");

}

@Override

public void onFailure(Exception arg0) {

System.out.println("失败");

}

});*/

//有关已执行请求的信息

RequestLine requestLine =response.getRequestLine();//返回响应的主机

HttpHost host =response.getHost();//响应状态行,您可以从中检索状态代码

int statusCode =response.getStatusLine().getStatusCode();//响应头

Header[] headers =response.getHeaders();

String responseBody=EntityUtils.toString(response.getEntity());

System.out.println(requestLine.getUri());

System.out.println(host);

System.out.println(statusCode);

System.out.println(headers);

System.out.println(responseBody);

}public static void main(String[] args) throwsIOException {

RestClient restClient=buildRestClient();

request(restClient);//关闭restClient

restClient.close();

}

3、RequestConfigCallback 和 HttpClientConfigCallback 的一些常用的配置

RequestConfigCallback和HttpClientConfigCallback允许Apache Async Http客户机公开的任何定制。这些回调使修改客户机的某些特定行为成为可能,而无需覆盖使用RestClient初始化的所有其他默认配置。本节描述一些常见的场景,这些场景需要对底层Java REST客户机进行额外的配置。

3.1、身份验证

final CredentialsProvider credentialsProvider =

newBasicCredentialsProvider();

credentialsProvider.setCredentials(AuthScope.ANY,new UsernamePasswordCredentials("user", "password"));

RestClientBuilder builder=RestClient.builder(new HttpHost("localhost", 9200))

.setHttpClientConfigCallback(newHttpClientConfigCallback() {

@OverridepublicHttpAsyncClientBuilder customizeHttpClient(

HttpAsyncClientBuilder httpClientBuilder) {//httpClientBuilder.disableAuthCaching(); ①

returnhttpClientBuilder

.setDefaultCredentialsProvider(credentialsProvider);

}

});

①可以禁用抢占式身份验证,这意味着每个请求都将在没有授权头的情况下发送,以查看它是否被接受,并且在接收到HTTP 401响应后,它将使用基本身份验证头重新发送完全相同的请求。

3.2、默认情况下,Apache Http Async客户机启动一个dispatcher线程和连接管理器使用的多个工作线程,以及本地检测到的处理器的数量(取决于Runtime.getRuntime(). availableprocessors()返回的是什么)。线程数可以修改如下:

RestClientBuilder builder =RestClient.builder(new HttpHost("localhost", 9200))

.setHttpClientConfigCallback(newHttpClientConfigCallback() {

@OverridepublicHttpAsyncClientBuilder customizeHttpClient(

HttpAsyncClientBuilder httpClientBuilder) {returnhttpClientBuilder.setDefaultIOReactorConfig(

IOReactorConfig.custom()

.setIoThreadCount(1)

.build());

}

});

3.3、设置链接超时或者socket超时

RestClientBuilder builder =RestClient.builder(new HttpHost("localhost", 9200))

.setRequestConfigCallback(newRestClientBuilder.RequestConfigCallback() {

@OverridepublicRequestConfig.Builder customizeRequestConfig(

RequestConfig.Builder requestConfigBuilder) {returnrequestConfigBuilder

.setConnectTimeout(5000)

.setSocketTimeout(60000);

}

})

.setMaxRetryTimeoutMillis(60000);

3.4、加密传输

KeyStore truststore = KeyStore.getInstance("jks");try (InputStream is =Files.newInputStream(keyStorePath)) {

truststore.load(is, keyStorePass.toCharArray());

}

SSLContextBuilder sslBuilder=SSLContexts.custom()

.loadTrustMaterial(truststore,null);final SSLContext sslContext =sslBuilder.build();

RestClientBuilder builder=RestClient.builder(new HttpHost("localhost", 9200, "https"))

.setHttpClientConfigCallback(newHttpClientConfigCallback() {

@OverridepublicHttpAsyncClientBuilder customizeHttpClient(

HttpAsyncClientBuilder httpClientBuilder) {returnhttpClientBuilder.setSSLContext(sslContext);

}

});

4、嗅探器(Sniffer):允许从运行的elasticsearch集群中自动发现节点,并将其设置到现有的RestClient实例中。 默认情况下,它将使用Nodes Info api来检索属于集群的节点,并使用jackson解析响应的json数据。假如集群中有100个节点,如果我们全部用手写进代码那样麻烦而且容易出错。这时候就可以使用嗅探器来自动发现节点。

4.1、先引入jar包

org.elasticsearch.client

elasticsearch-rest-client-sniffer

6.6.0

4.2、sinffer的创建和关闭

RestClient restClient =RestClient.builder(new HttpHost("localhost", 9201, "http"))

.build();//创建Sniffer 并设置一分钟更新一次,默认为5分钟

Sniffer sniffer =Sniffer.builder(restClient)

.setSniffIntervalMillis(60000).build();//sniffer需要在restClient之前关闭

sniffer.close();

restClient.close();

4.3、还可以启用故障嗅探功能,这意味着在每次故障之后,节点列表将立即更新,而不是在接下来的普通嗅探轮中更新。在这种情况下,需要首先创建一个SniffOnFailureListener,并在创建RestClient时提供它。同样,在稍后创建嗅探器之后,它需要与相同的SniffOnFailureListener实例相关联,该实例将在每次失败时得到通知,并使用嗅探器执行所述的额外嗅探。

SniffOnFailureListener sniffOnFailureListener =

newSniffOnFailureListener();

RestClient restClient=RestClient.builder(new HttpHost("localhost", 9201))

.setFailureListener(sniffOnFailureListener)

.build();

Sniffer sniffer=Sniffer.builder(restClient)

.setSniffAfterFailureDelayMillis(30000)

.build();

sniffOnFailureListener.setSniffer(sniffer);

4.4、使用https进行连接

RestClient restClient =RestClient.builder(new HttpHost("localhost", 9201, "http"))

.build();

NodesSniffer nodesSniffer= newElasticsearchNodesSniffer(

restClient,

ElasticsearchNodesSniffer.DEFAULT_SNIFF_REQUEST_TIMEOUT,

ElasticsearchNodesSniffer.Scheme.HTTPS);

Sniffer sniffer=Sniffer.builder(restClient)

.setNodesSniffer(nodesSniffer).build();

4.5、同样,也可以定制sniffRequestTimeout,默认值为1秒。是超时参数作为一个查询字符串参数当调用节点信息提供api,所以当超时过期在服务器端,一个有效的响应仍返回虽然可能只包含节点的一个子集,是集群的一部分,那些在那之前已经做出了回应。

RestClient restClient =RestClient.builder(new HttpHost("localhost", 9201, "http"))

.build();

NodesSniffer nodesSniffer= newElasticsearchNodesSniffer(

restClient,

TimeUnit.SECONDS.toMillis(5),

ElasticsearchNodesSniffer.Scheme.HTTP);

Sniffer sniffer=Sniffer.builder(restClient)

.setNodesSniffer(nodesSniffer).build();

二、Java High Level REST Client

Java高级REST客户机在Java低级REST客户机之上工作。它的主要目标是公开API特定的方法,这些方法接受请求对象作为参数并返回响应对象,以便请求编组和响应反编组由客户机本身处理。 可以同步或异步调用每个API。同步方法返回一个响应对象,而异步方法(名称以async后缀结尾)则需要一个侦听器参数,一旦响应或错误为r,侦听器参数(在低级客户机管理的线程池上)就会被通知

1、兼容性

1.1、Java高级REST客户机需要Java 1.8,并且依赖于Elasticsearch core项目。客户端版本与客户端开发的Elasticsearch版本相同

1.2、高级客户机保证能够与运行在相同主版本和更大或更小版本上的Elasticsearch节点通信。它不需要处于与之通信的Elasticsearch节点相同的次要版本中,因为它是向前兼容的,这意味着它支持与后来版本的Elasticsearch通信。

但是向前版本通信可能会有不兼容的。例如在6.1和6.0之间,如果6.1客户机支持一些api的新请求体字段,而这些api是6.0节点所不知道的。

1.3、建议当elasticsearch集群版本升级后,最好是将客户端版本也升级到该版本。

2、引入jar包

org.elasticsearch.client

elasticsearch-rest-high-level-client

6.6.0

3、编写代码

public classHighLeveRestClientTest {public static void main(String[] args) throwsIOException {//创建高级rest客户端

/*高级客户端将在内部创建用于基于提供的构建器执行请求的低级客户端。这个低级客户机维护一个连接池,并启动一些线程,

* 所以当您真正完成高级客户机的操作时,应该关闭它,然后关闭内部低级客户机来释放这些资源。

**/

//高级rest客户端和低级客户端一样设置requestOptions,具体参考低级客户端。

RestHighLevelClient restClient = newRestHighLevelClient(

RestClient.builder(new HttpHost("127.0.0.1", 9201),new HttpHost("127.0.0.1", 9202),new HttpHost("127.0.0.1", 9203)

)

);//构建请求,有很多种构建请求的方式,这里只列举一种

IndexRequest request = newIndexRequest("posts","doc","1");

String jsonString= "{" +

"\"user\":\"kimchy\"," +

"\"postDate\":\"2013-01-30\"," +

"\"message\":\"trying out Elasticsearch\"" +

"}";

request.source(jsonString, XContentType.JSON);//执行请求

IndexResponse indexResponse =restClient.index(request, RequestOptions.DEFAULT);//处理返回

String index =indexResponse.getIndex();

String type=indexResponse.getType();

String id=indexResponse.getId();long version =indexResponse.getVersion();

System.out.println(index);

System.out.println(type);

System.out.println(id);

System.out.println(version);if (indexResponse.getResult() ==DocWriteResponse.Result.CREATED) {

System.out.println("创建");

}else if (indexResponse.getResult() ==DocWriteResponse.Result.UPDATED) {

System.out.println("更新");

}

ReplicationResponse.ShardInfo shardInfo=indexResponse.getShardInfo();if (shardInfo.getTotal() !=shardInfo.getSuccessful()) {

}if (shardInfo.getFailed() > 0) {for(ReplicationResponse.ShardInfo.Failure failure :

shardInfo.getFailures()) {

String reason=failure.reason();

System.out.println(reason);

}

}//关闭客户端

restClient.close();

}

}

java api es_ES 常用java api相关推荐

  1. java指令_常用java的命令有哪些

    常用java的命令有哪些 用javac命令加上的java源文件的路径就会编译成.class文件.用java命令java加上.class文件的路径就会运行java程序.以下是小编为大家搜索整理的常用ja ...

  2. 【蓝桥杯Java组】Java参赛选手常用集合API总结

  3. 亚马逊 开发者api 调用_关于微信API:常用微信API文档整理

    微信公众平台消息接口为开发者提供了一种新的消息处理方式.微信公众平台消息接口为开发者提供与用户进行消息交互的能力.对于成功接入消息接口的微信公众账号,当用户发消息给公众号,微信公众平台服务器会使用HT ...

  4. JAVA入门————API(常用API)

    下面给各位扩展一些JAVA开发中常用的API 文档注释(ApiDoc): import javax.crypto.spec.PSource; 文档注释是功能级注释,只在三个地方使用,分别是:类,方法, ...

  5. Java中常用的API

    文章目录 前言 一.java.lang String StringBuilder Integer parseXXX Math Object System Throwable Thread Runnab ...

  6. 【java中常用的API】

    java中有很多常用的API,它们提供了便捷的使用方法和工具类,让我们来看一看java中常用的API吧. 1.math类: 它包含基本的数字运算方法,如对数.指数.平方根和三角函数等,一般数据类型为d ...

  7. 常用Java开发工具

    常用Java开发工具 常用Java开发工具 一.eclipse使用2分钟入门 二.[下载](http://www.eclipse.org/downloads/eclipse-packages/)和安装 ...

  8. 常用快递API接口文档说明

    适用范围 在越来越多的生活场景中,会需要使用到常用快递API: 电商平台用于跟踪商品投递状态,以及用户查询快递进度. 便民服务平台用于提供给用户查询快递,作为增值服务提升用户活跃度. 银行涉及到给客户 ...

  9. java 常用的api_Java中常用的API(一)——Object

    概述 如果要问Java为什么是用起来非常舒服的语言,那很大一部分的功劳就是JavaAPI的.API定义了许多封装好的类和方法供我们使用,来处理特定的问题,所以学习常用的API是非常重要的. 同时,面向 ...

最新文章

  1. python操作mysql的增删改查_详解使用pymysql在python中对mysql的增删改查操作(综合)...
  2. 一步一步学Silverlight 2系列(32):图形图像综合实例—“功夫之王”剧照播放_转载...
  3. Spring5源码 - 01 BeanDefination源码分析
  4. debian上安装docker ce
  5. java所定义的版本中不包括_JAVA语言基础题、 求做完
  6. 有没有五金产品展开计算机软件,拆单软件功能介绍
  7. 项目周报模板(工作周报模板)
  8. 幅值与峰峰值的计算_交流电有效值与峰值计算公式的推导过程.
  9. 封装解决WebView的那些坑
  10. 人脸检测-人脸对齐-人脸识别原理及方法
  11. k8s运维-06-kubectl delete node的过程
  12. AI项目环境搭建go+supervisor+openresty
  13. Oracle数据库:约束行限制where语句,判断条件,比较条件,字符串日期格式,in,like,escape,null语句
  14. 微信公众号鸿蒙盾额度认证为什么要交钱,微信公众号收费标准是什么?认证流程介绍!...
  15. Ubuntu 10.04内核源码树的编译和安装
  16. 前端程序员Vue开发经验总结
  17. 二级python——绘制七彩圆圈
  18. 购物网站(内容页面)
  19. 书本例子strindex函数
  20. vue路由跳转清空数据

热门文章

  1. 关于使用easyUI遇到过的一些坑
  2. MQ(消息队列)常见的应用场景解析
  3. ORB-SLAM2初步(跟踪模块)
  4. APPIUM+Python+HTMLTestRunner(转)
  5. 获取aplicationContext对象,从而获取任何注入的对象
  6. PL/SQL Developer使用教程(中文)
  7. 判断当前是否运行于Design Mode
  8. 海天味业打造高端调味品领衔食品美味
  9. Codeforces Round #315 (Div. 1) A. Primes or Palindromes? 暴力
  10. SharePoint 2013必备组件离线包安装:AppFabric无法安装问题解决