【问题标题】:ElesticSearch REST HTTP request through redirected URL通过重定向 URL 的 ElasticSearch REST HTTP 请求
【发布时间】:2020-07-23 01:52:21
【问题描述】:

我正在寻求社区帮助,因为我在请求具有特殊重定向 URL 的 ElasticSearch 数据库时遇到了一些问题。

你能帮帮忙吗?

非常感谢。

首先,让我们从一个很好的案例开始。

假设我有这个标准的 ElasticSearch URL:http://192.168.75.197:9200

使用 ElasticSearch 文档:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/_changing_the_client_8217_s_initialization_code.html

我可以用这个 Java 代码请求它:

package com.acme.elasticsearch;

import java.net.URL;

import org.apache.http.HttpHost;
import org.apache.http.auth.AuthScope;
import org.apache.http.auth.UsernamePasswordCredentials;
import org.apache.http.client.CredentialsProvider;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.nio.client.HttpAsyncClientBuilder;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestClientBuilder;
import org.elasticsearch.client.RestClientBuilder.HttpClientConfigCallback;
import org.elasticsearch.client.RestHighLevelClient;

public class TestRedirect {
    private static final String rawURL = "http://192.168.75.197:9200";
    private static final String index = "demoindex02";
    private static final String id = "Zw6AXnEB8ovVkXyeZ9wF";

    public static void main(String[] args) throws Exception {
        // parse URL
        System.out.println("URL = " + rawURL);
        URL parsedHttpUrl = new URL(rawURL);
        String protocol = parsedHttpUrl.getProtocol();
        String host = parsedHttpUrl.getHost();
        int port = parsedHttpUrl.getPort();
        String path = parsedHttpUrl.getPath();
        System.out.println("protocol = " + protocol);
        System.out.println("host = " + host);
        System.out.println("port = " + port);
        System.out.println("path = " + path);
        // instantiate HTTP credentials
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        credentialsProvider.setCredentials(AuthScope.ANY,
                new UsernamePasswordCredentials(Credential.user, Credential.password));
        // instantiate REST high level client
        RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(host, port, protocol));
        restClientBuilder.setHttpClientConfigCallback(new HttpClientConfigCallback() {
            @Override
            public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
            }
        });
        RestHighLevelClient restHighLevelClient = new RestHighLevelClient(restClientBuilder);
        // simple get request
        GetRequest getRequest = new GetRequest(index, id);
        GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);
        System.out.println("getResponse = " + getResponse);
    }

}

我可以在控制台中看到一个很好的结果:

URL = http://192.168.75.197:9200
protocol = http
host = 192.168.75.197
port = 9200
path = 
getResponse = {"_index":"demoindex02","_type":"_doc","_id":"Zw6AXnEB8ovVkXyeZ9wF","_version":1,"_seq_no":16,"_primary_term":1,"found":true,"_source":{"id":"1","firstName":"Jason","lastName":"GIBBS","title":"Mister","company":"Mister","phones":["(413)442-5250","(413)442-5252","(413)454-5663"]}}

现在问题来了:ElasticSearch URL 被重定向(例如,在 Apache、Nginx 或 F5 前面...)

网址变为:http://192.168.75.197:8060/v1/es/

这个新网址有效:

1.仅更改网址

我只用新的 URL 调整我的 java 代码(客户端和请求保持不变):

private static final String rawURL = "http://192.168.75.197:8060/v1/es/";
RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(host, port, protocol));
GetRequest getRequest = new GetRequest(index, id);

问题是:404 Not Found

Exception in thread "main" ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...
ElasticsearchStatusException[Unable to parse response body]; nested: ResponseException[method [GET], host [http://192.168.75.197:8060], URI [/demoindex02/_doc/Zw6AXnEB8ovVkXyeZ9wF], status line [HTTP/1.1 404 Not Found]
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.16.1</center>
</body>
</html>
];
    at org.elasticsearch.client.RestHighLevelClient.parseResponseException(RestHighLevelClient.java:1686)
    at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1443)
    at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1403)
    at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:1373)
    at org.elasticsearch.client.RestHighLevelClient.get(RestHighLevelClient.java:699)
    at com.acme.elasticsearch.TestRedirect.main(TestRedirect.java:52)
    Suppressed: java.lang.IllegalStateException: Unsupported Content-Type: text/html
        at org.elasticsearch.client.RestHighLevelClient.parseEntity(RestHighLevelClient.java:1703)
        at org.elasticsearch.client.RestHighLevelClient.parseResponseException(RestHighLevelClient.java:1683)
        ... 5 more
Caused by: org.elasticsearch.client.ResponseException: method [GET], host [http://192.168.75.197:8060], URI [/demoindex02/_doc/Zw6AXnEB8ovVkXyeZ9wF], status line [HTTP/1.1 404 Not Found]
<html>
<head><title>404 Not Found</title></head>
<body>
<center><h1>404 Not Found</h1></center>
<hr><center>nginx/1.16.1</center>
</body>
</html>

    at org.elasticsearch.client.RestClient.convertResponse(RestClient.java:260)
    at org.elasticsearch.client.RestClient.performRequest(RestClient.java:238)
    at org.elasticsearch.client.RestClient.performRequest(RestClient.java:212)
    at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1433)
    ... 4 more

2。仅更改 URL 和客户端

我只用新的 URL 调整我的 java 代码并添加到客户端的路径(请求保持不变):

private static final String rawURL = "http://192.168.75.197:8060/v1/es/";
RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(host + path, port, protocol));
GetRequest getRequest = new GetRequest(index, id);

问题是:未知主机 192.168.75.197/v1/es/

URL = http://192.168.75.197:8060/v1/es/
protocol = http
host = 192.168.75.197
port = 8060
path = /v1/es/
Exception in thread "main" java.io.IOException: 192.168.75.197/v1/es/
    at org.elasticsearch.client.RestClient.extractAndWrapCause(RestClient.java:809)
    at org.elasticsearch.client.RestClient.performRequest(RestClient.java:225)
    at org.elasticsearch.client.RestClient.performRequest(RestClient.java:212)
    at org.elasticsearch.client.RestHighLevelClient.internalPerformRequest(RestHighLevelClient.java:1433)
    at org.elasticsearch.client.RestHighLevelClient.performRequest(RestHighLevelClient.java:1403)
    at org.elasticsearch.client.RestHighLevelClient.performRequestAndParseEntity(RestHighLevelClient.java:1373)
    at org.elasticsearch.client.RestHighLevelClient.get(RestHighLevelClient.java:699)
    at com.acme.elasticsearch.TestRedirect.main(TestRedirect.java:52)
Caused by: java.net.UnknownHostException: 192.168.75.197/v1/es/
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
    at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:929)
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1324)
    at java.net.InetAddress.getAllByName0(InetAddress.java:1277)
    at java.net.InetAddress.getAllByName(InetAddress.java:1193)
    at java.net.InetAddress.getAllByName(InetAddress.java:1127)
    at org.apache.http.impl.conn.SystemDefaultDnsResolver.resolve(SystemDefaultDnsResolver.java:45)
    at org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager$InternalAddressResolver.resolveRemoteAddress(PoolingNHttpClientConnectionManager.java:664)
    at org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager$InternalAddressResolver.resolveRemoteAddress(PoolingNHttpClientConnectionManager.java:635)
    at org.apache.http.nio.pool.AbstractNIOConnPool.processPendingRequest(AbstractNIOConnPool.java:474)
    at org.apache.http.nio.pool.AbstractNIOConnPool.lease(AbstractNIOConnPool.java:280)
    at org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.requestConnection(PoolingNHttpClientConnectionManager.java:295)
    at org.apache.http.impl.nio.client.AbstractClientExchangeHandler.requestConnection(AbstractClientExchangeHandler.java:377)
    at org.apache.http.impl.nio.client.DefaultClientExchangeHandlerImpl.start(DefaultClientExchangeHandlerImpl.java:129)
    at org.apache.http.impl.nio.client.InternalHttpAsyncClient.execute(InternalHttpAsyncClient.java:141)
    at org.elasticsearch.client.RestClient.performRequest(RestClient.java:221)
    ... 6 more

3.更改 URL、客户端和请求

我只用新的 URL 调整我的 java 代码,添加客户端和请求的路径:

private static final String rawURL = "http://192.168.75.197:8060/v1/es/";
RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(host + path, port, protocol));
GetRequest getRequest = new GetRequest(path + index, id);

问题与上面第 2 点完全相同:未知主机 192.168.75.197/v1/es/

4.仅更改 URL 和请求

我只使用新 URL 调整我的 java 代码并添加请求路径(客户端保持不变):

private static final String rawURL = "http://192.168.75.197:8060/v1/es/";
RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(host, port, protocol));
GetRequest getRequest = new GetRequest(path + index, id);

问题与上面第 1 点完全相同:404 Not Found

【问题讨论】:

    标签: java rest elasticsearch redirect


    【解决方案1】:

    终于有答案了:RestHighLevelClient - Accessing an elastic http endpoint behind reverse proxy

    所以我这样修改了我的代码:

            // instantiate REST high level client
            RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(host, port, protocol));
            restClientBuilder.setHttpClientConfigCallback(new HttpClientConfigCallback() {
                @Override
                public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                    return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                }
            });
            restClientBuilder.setPathPrefix(path);
            RestHighLevelClient restHighLevelClient = new RestHighLevelClient(restClientBuilder);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      • 2017-09-17
      • 1970-01-01
      • 2016-06-30
      • 1970-01-01
      • 2021-10-01
      相关资源
      最近更新 更多