简体   繁体   English

如何在java中制定curl -XHEAD请求

[英]How to formulate curl -XHEAD request in java

I am using elasticsearch Java API and trying to make a curl call in order to find out whether a document exists in my index or not. 我正在使用elasticsearch Java API并尝试进行curl调用,以便查明我的索引中是否存在文档。 This is how it is done in the command line. 是在命令行中完成的。 As far as I can tell from the posts here, I should either use HttpURLConnection java class or apache httpclient to send the curl request in java. 据我所知,我应该使用HttpURLConnection java类或apache httpclient在java中发送curl请求。 My request should be like : 我的要求应该是:

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

There are actually many questions on how to send curl requests via java, but the answers are not that explanatory - thus I am not sure how to configure the request parameters for the curl head request. 关于如何通过java发送curl请求实际上有很多问题,但答案不是那么解释 - 因此我不确定如何为curl head请求配置请求参数。 So far, I have reproduced this answer from Ashay and it doesn't work. 到目前为止,我已经从Ashay转载了这个答案,但它不起作用。

Does anybody send curl calls in elasticsearch's java API and can explain how to do it? 有人在elasticsearch的java API中发送curl调用并且可以解释如何做吗?

Here is my code and the error I get is "java.net.MalformedURLException: no protocol" 这是我的代码,我得到的错误是“java.net.MalformedURLException:no protocol”

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()));

PS the document ids of this index are urls and that is why I need to encode them. PS这个索引的文档ID是网址,这就是我需要对它们进行编码的原因。 On the other hand, I am not sure whether I should encode the full http request or not. 另一方面,我不确定是否应编码完整的http请求。

Following snippet could be a starting point. 以下片段可能是一个起点。

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());
        });

Using requestURL = "http://localhost:9200"; 使用requestURL = "http://localhost:9200"; with a default elasticsearch installation would return 使用默认的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]

add Maybe you can try something similar to following steps. 添加也许您可以尝试类似于以下步骤的内容。 Amend them to your needs. 根据您的需求进行修改。 Maybe you can skip the first step. 也许你可以跳过第一步。

index something 索引的东西

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

query it from commandline 从命令行查询它

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

output 产量

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

query using the above Java snippet 使用上面的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);
    }
}

output 产量

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
}}

The example use a default elasticsearch installation. 该示例使用默认的elasticsearch安装。

Depending on what you really want to achieve. 取决于你真正想要实现的目标。 You might be better use the elasticsearch TransportClient . 您可能更好地使用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));
        }
    }
}

output 产量

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM