2016-05-02 2 views
1

Я использую API elasticsearch Java и пытаюсь сделать вызов curl, чтобы узнать, существует ли документ в моем индексе или нет. This - как это делается в командной строке. Насколько я могу судить по сообщениям здесь, я должен либо использовать java-класс HttpURLConnection, либо apache httpclient, чтобы отправить запрос curl в java. Моя просьба должна быть:Как сформулировать curl -XHEAD-запрос в java

curl -i -XHEAD http://localhost:9200/indexName/mappingName/docID.

На самом деле существует много вопросов о том, как отправлять запросы на завивки через java, но ответы не объясняют это, поэтому я не уверен, как настроить параметры запроса для запроса на завивку. До сих пор я ответил this ответам от Ashay, и это не сработало.

Кто-нибудь посылает вызовы curl в java API elasticsearch и может объяснить, как это сделать?

Вот мой код, и ошибка, я получаю "java.net.MalformedURLException: нет протокола"

import org.apache.commons.codec.binary.Base64; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.net.URLEncoder; 

String encodedURL = URLEncoder.encode(new StringBuilder() 
    .append("http://").append(serverName).append(":9200/") // elasticsearch port 
    .append(indexName).append("/").append(mappingName).append("/") 
    .append(url).toString(), "UTF-8"); // docID is a url 
System.out.print("encodedURL : " + encodedURL + "\n"); 

URL url = new URL(new StringBuilder().append(encodedURL).toString()); 
System.out.print("url "+ url.toString() + "\n"); 

HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
connection.setRequestProperty("X-Requested-With", "Curl"); 
connection.setRequestMethod("HEAD"); 

String userpass = new StringBuilder().append(username).append(":").append(password).toString(); 
String basicAuth = new StringBuilder().append("Basic ").append(new String(new Base64().encode(userpass.getBytes()))).toString(); 
connection.setRequestProperty("Authorization", basicAuth); 
String inputLine; 
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 

P.S. Идентификаторы документа этого индекса являются URL-адресами, и поэтому мне нужно их кодировать. С другой стороны, я не уверен, должен ли я кодировать полный HTTP-запрос или нет.

ответ

0

Следующий фрагмент может быть отправной точкой.

String serverName = "localhost"; 
String indexName = "index_name"; 
String mappingName = "mapping_name"; 
String docId = "FooBarId"; 

String username = "JohnDoe"; 
String password = "secret"; 

String requestURL = String.format("http://%s:9200/%s/%s/%s", 
     serverName, 
     indexName, 
     mappingName, 
     docId 
); 
System.out.println("requestURL: " + requestURL); 

URL url = new URL(requestURL); 
System.out.println("URL: " + url); 

HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
connection.setRequestProperty("X-Requested-With", "Curl"); 
connection.setRequestMethod("HEAD"); 

String credentials = username + ":" + password; 

Base64.Encoder encoder = Base64.getEncoder(); 
String basicAuth = "Basic " + encoder.encodeToString(credentials.getBytes()); 

connection.setRequestProperty("Authorization", basicAuth); 

connection.getHeaderFields() 
     .entrySet() 
     .forEach((Entry<String, List<String>> t) -> { 
      System.out.printf("%-20s : %s%n", t.getKey(), t.getValue()); 
     }); 

Использование requestURL = "http://localhost:9200"; с установкой elasticsearch по умолчанию будет возвращать

requestURL: http://localhost:9200 
URL: http://localhost:9200 
null     : [HTTP/1.1 200 OK] 
Content-Length  : [0] 
Content-Type   : [text/plain; charset=UTF-8] 

добавить Может быть, вы можете попробовать что-то похожее на следующие шаги. Измените их в соответствии с вашими потребностями. Возможно, вы можете пропустить первый шаг.

Индекс что-то

curl -XPUT "http://localhost:9200/books/book/1" -d' 
{ 
    "title": "The Hitchhikers Guide to the Galaxy", 
    "author": "Douglas Adams", 
    "year": 1978 
}' 

запрос его из командной строки

curl -X GET http://localhost:9200/books/book/1 

выход

{"_index":"books","_type":"book","_id":"1","_version":1,"found":true,"_source": 
{ 
    "title": "The Hitchhikers Guide to the Galaxy", 
    "author": "Douglas Adams", 
    "year": 1978 
}} 

запрос с использованием выше Java фрагмент кода

String serverName = "localhost"; 
String indexName = "books"; 
String mappingName = "book"; 
String docId = "1"; 
String requestURL = String.format("http://%s:9200/%s/%s/%s", 
     serverName, 
     indexName, 
     mappingName, 
     docId 
); 
System.out.println("requestURL: " + requestURL); 
URL url = new URL(requestURL); 
HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
connection.setRequestMethod("GET"); 
connection.getHeaderFields() 
     .entrySet() 
     .forEach((Entry<String, List<String>> t) -> { 
      System.out.printf("%-20s : %s%n", t.getKey(), t.getValue()); 
     }); 
try (InputStream inputStream = connection.getInputStream()) { 
    for (int i = inputStream.read(); i > -1; i = inputStream.read()) { 
     System.out.print((char) i); 
    } 
} 

выход

requestURL: http://localhost:9200/books/book/1 
null     : [HTTP/1.1 200 OK] 
Content-Length  : [184] 
Content-Type   : [application/json; charset=UTF-8] 
{"_index":"books","_type":"book","_id":"1","_version":1,"found":true,"_source": 
{ 
    "title": "The Hitchhikers Guide to the Galaxy", 
    "author": "Douglas Adams", 
    "year": 1978 
}} 

Пример использования установки по умолчанию elasticsearch.

В зависимости от того, чего вы действительно хотите достичь. Возможно, вам лучше использовать elasticsearch TransportClient.

import java.net.InetAddress; 
import org.elasticsearch.action.get.GetRequestBuilder; 
import org.elasticsearch.action.get.GetResponse; 
import org.elasticsearch.client.Client; 
import org.elasticsearch.client.transport.TransportClient; 
import org.elasticsearch.common.transport.InetSocketTransportAddress; 

public class GetDemo { 

    public static void main(String[] args) throws Exception { 
     InetAddress hostAddr = InetAddress.getByName("localhost"); 
     InetSocketTransportAddress socketAddr = 
       new InetSocketTransportAddress(hostAddr, 9300); 
     try (Client client = TransportClient.builder().build() 
       .addTransportAddress(socketAddr)) { 
      GetRequestBuilder request = client.prepareGet("books", "book", "1"); 
      GetResponse response = request.execute().actionGet(); 
      response.getSource() 
        .forEach((k, v) -> System.out.printf("%-6s: %s%n", k, v)); 
     } 
    } 
} 

выход

... 
year : 1978 
author: Douglas Adams 
title : The Hitchhikers Guide to the Galaxy 
+0

Спасибо за ответ.В вашем примере кода появляется ошибка «null = [HTTP/1.1 400 Bad Request] Content-Length = [145] Content-Type = [text/plain; charset = UTF-8]» для всех docIds. Единственные изменения, которые я сделал, это заменить localhost на имя нашего сервера, а также использовать «Base64.encodeBase64 (credentials.getBytes())»; потому что Base64.Encoder является закрытым – KLaz

+0

@KonstantinaLazaridou [Base64.Encoder] (http://docs.oracle.com/javase/8/docs/api/java/util/Base64.Encoder.html) является «открытым статическим классом» в Java 8. Вы проверили свой сгенерированный 'url' и' basicAuth'? Поскольку 'HTTP 400' для' запроса не может быть понят сервером из-за неправильного синтаксиса. ' – SubOptimal

+0

да, URL-адрес кажется прекрасным, и информация пользователя также верна. Возможно ли, что сервер использует другую систему шифрования, чем Base64? Я также оценил свойство авторизации (в случае, если это не было необходимо), но по-прежнему та же ошибка. Я также не знаю, является ли '.setRequestProperty (« X-Requested-With »,« Curl »);' синтаксически корректным. – KLaz

Смежные вопросы