Elasticsearch-Vorgang über die REST-API mit Apache HttpClient in Java

Previously, I tested some very basic operations in Elasticsearch via REST API. So, in this post, I am going to implement those very basic operations in Java with Apache HttpClient.

Import modules Basic Elasticsearch operations using HTTP GET and POST methods are used in this post. So you need to import the following modules.

import org.apache.commons.codec.binary.Base64;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;

Send GET HTTP Request In this section, an implementation in Java of the following Elasticsearch operation is explained.

root@ubuntu:~# curl -XGET "http://127.0.0.1:9200/"

First of all, you need to define HttpClient and HttpGet objects.

        HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet(base_url);

Next, you need to add auth header to the request object.

        String auth = elastic_user + ":" + elastic_password;
        byte[] encodedAuth = Base64.encodeBase64(
                auth.getBytes(Charset.forName("ISO-8859-1")));
        String authHeader = "Basic " + new String(encodedAuth);
        request.setHeader(HttpHeaders.AUTHORIZATION, authHeader);

Then, you can send the GET Request and the response will return.

        ResponseHandler<String> responseHandler = new BasicResponseHandler();
        String response = client.execute(request, responseHandler);
        logger.info("Sending 'GET' request to URL : " + base_url);
        logger.info("HTTP Response: " + response);

In String response, only the body of response is contained like below.

2017-08-27 03:51:46,538 [main] INFO : HTTP Response: {
  "name" : "MBUCDnj",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "3QGMhCBPQSSNusOn6m325g",
  "version" : {
    "number" : "5.5.2",
    "build_hash" : "b2f0c09",
    "build_date" : "2017-08-14T12:33:14.154Z",
    "build_snapshot" : false,
    "lucene_version" : "6.6.0"
  },
  "tagline" : "You Know, for Search"
}

Memo As Elasticsearch returns its response in Json format, I tried to find a way to flatten its json response in Java code like I did in Scala. Honestly, I struggled to implement the function in scala, but I found a very easy way to do the same in Java just by googling like java flatten json. You can use this library https://github.com/wnameless/json-flattener.

        Map<String, Object> flattenJson = JsonFlattener.flattenAsMap(response);
        logger.info("Flatten the response json: "+ flattenJson);

Then, you can get the response in flattened json format like following.

2017-08-27 03:51:46,615 [main] INFO : Flatten the response json: {"name":"MBUCDnj","cluster_name":"elasticsearch","cluster_uuid":"3QGMhCBPQSSNusOn6m325g","version.number":"5.5.2","version.build_hash":"b2f0c09","version.build_date":"2017-08-14T12:33:14.154Z","version.build_snapshot":false,"version.lucene_version":"6.6.0","tagline":"You Know, for Search"}

Send POST HTTP Request In this section, an implementation in Java of the following Elasticsearch operation is explained.

root@ubuntu:~# curl -XPOST  "http://127.0.0.1:9200/test/user" -d '{"name":"test_user"}'

Like I did in GET method, you need to define HttpClient and HttpPost objects at first. Note that you need to define url including index and type like http://url:port/index/type.

        HttpClient client = new DefaultHttpClient();
        HttpPost post_request = new HttpPost(url);

Next, you need to add auth header to the request object.

        String auth = elastic_user + ":" + elastic_password;
        byte[] encodedAuth = Base64.encodeBase64(
                auth.getBytes(Charset.forName("ISO-8859-1")));
        String authHeader = "Basic " + new String(encodedAuth);
        request.setHeader(HttpHeaders.AUTHORIZATION, authHeader);

Then, set Json data to post. In this test case, I just defined json_data as String. Maybe in other cases, you will need to implement some json operation using such as gson and org.json. So far, I have just briefly googled it but gson seems a little bit easier to implement.

gson: https://github.com/google/gson org.json: https://stleary.github.io/JSON-java/

        StringEntity json_to_post = new StringEntity(json_data);
        post_request.setEntity(json_to_post);

Finaly, execute HTTP POST Request.

    HttpResponse response = client.execute(post_request);
    
    logger.info("Response Code : " + response.getStatusLine().getStatusCode());
    BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
    StringBuffer result = new StringBuffer();
    String line = "";
        while ((line = rd.readLine()) != null) {
                result.append(line);
                }
                logger.info(result.toString());

You will get a response like this.

2017-08-27 03:51:46,661 [main] INFO : Response Code : 201
2017-08-27 03:51:46,661 [main] INFO : {"_index":"test","_type":"user","_id":"AV4jUaROJrPGAVUzWKwL","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"created":true}

Recommended Posts

Elasticsearch-Vorgang über die REST-API mit Apache HttpClient in Java
Ich habe versucht, die Elasticsearch-API in Java zu verwenden
Versuchen Sie es mit der Stream-API in Java
Versuchen Sie es mit der JSON-Format-API in Java
ChatWork4j für die Verwendung der ChatWork-API in Java
[Java] API-Erstellung mit Jerjey (Jax-rs) mit Eclipse
Versuchen Sie, die Cloud Vision-API von GCP in Java zu verwenden
Versuchen Sie es mit der Syntaxanalyse der COTOHA-API in Java
Zabbix API in Java
Versuchen Sie es mit RocksDB mit Java
Excel-Operation mit Apache POI
Java Stream API in 5 Minuten
Übersetzen mit der Microsoft Translator-Text-API in Java (Japanisch → Englisch)
Tipps zur Verwendung von Salesforce SOAP und Bulk API in Java
[Java] Stream API Zwischenoperation
Exportieren Sie ein Problem mithilfe der Java-API von JIRA
Verschlüsselung mit RSA-Verschlüsselung in Java
Generieren Sie die CloudStack-API-URL in Java
Implementieren Sie die REST-API mit Spring Boot
Treffen Sie Zaims API (OAuth 1.0) in Java
Ich habe versucht, die Java8 Stream API zu verwenden
Analysieren der COTOHA-API-Syntaxanalyse in Java
HTTPS-Verbindung mit tls1.2 in Java 6
Ich habe versucht, JWT in Java zu verwenden
JPA (Java Persistence API) in Eclipse
Implementieren Sie API Gateway Lambda Authorizer in Java Lambda
Datenverarbeitung mit der Stream-API von Java 8
Studieren Sie Java 8 (Datums-API im Paket java.time)
Rufen Sie die Windows-Benachrichtigungs-API in Java auf
Map ohne Verwendung eines Arrays in Java
Rufen Sie die Salesforce REST-API von Java aus auf
ERRORCODE = -4471 tritt in einer Java-Anwendung auf, die Db2 verwendet.
Erstellen Sie eine REST-API mit Apache2 + Passenger + Sinatra.
Lesen Sie Felica mit RC-S380 (PaSoRi) in Java
Statusüberwachung von Java-Apps mit Elasticsearch
Elementoperationsmethode in Appium TIPS (Java)