Я использую 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-запрос или нет.
Спасибо за ответ.В вашем примере кода появляется ошибка «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
@KonstantinaLazaridou [Base64.Encoder] (http://docs.oracle.com/javase/8/docs/api/java/util/Base64.Encoder.html) является «открытым статическим классом» в Java 8. Вы проверили свой сгенерированный 'url' и' basicAuth'? Поскольку 'HTTP 400' для' запроса не может быть понят сервером из-за неправильного синтаксиса. ' – SubOptimal
да, URL-адрес кажется прекрасным, и информация пользователя также верна. Возможно ли, что сервер использует другую систему шифрования, чем Base64? Я также оценил свойство авторизации (в случае, если это не было необходимо), но по-прежнему та же ошибка. Я также не знаю, является ли '.setRequestProperty (« X-Requested-With »,« Curl »);' синтаксически корректным. – KLaz