英文:
ElesticSearch REST HTTP request through redirected URL
问题
以下是翻译好的部分:
首先,让我们从一个案例开始。
假设我有这个标准的 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 {
// ...
}
}
现在我可以在控制台中看到一个好的结果:
接下来是问题:ElasticSearch 的 URL 被重定向了(例如,在 Apache、Nginx 或 F5 的前面)
新的 URL 变成:http://192.168.75.197:8060/v1/es/
这个新的 URL 是有效的:
- 仅更改 URL
我只调整了我的 Java 代码中的新 URL(客户端和请求保持不变):
private static final String rawURL = "http://192.168.75.197:8060/v1/es/";
问题是:404 Not Found
- 更改 URL 和客户端
我只调整了我的 Java 代码中的新 URL 并将路径添加到客户端(请求保持不变):
private static final String rawURL = "http://192.168.75.197:8060/v1/es/";
RestClientBuilder restClientBuilder = RestClient.builder(new HttpHost(host + path, port, protocol));
问题是:Unknown host 192.168.75.197/v1/es/
- 更改 URL、客户端和请求
我只调整了我的 Java 代码中的新 URL,并在客户端和请求中添加了路径:
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点完全相同:Unknown host 192.168.75.197/v1/es/
- 仅更改 URL 和请求
我只调整了我的 Java 代码中的新 URL,并在请求中添加了路径(客户端保持不变):
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
英文:
I am asking community help because I have some trouble requesting an ElasticSearch database with a special redirected URL.
Can you please give an hand on this ?
Thank you very much.
First, let's start with a fine case.
Let's assume that I have this standard ElasticSearch URL : http://192.168.75.197:9200
With ElasticSearch documentation : https://www.elastic.co/guide/en/elasticsearch/client/java-rest/current/_changing_the_client_8217_s_initialization_code.html
I can request it with this Java code :
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-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);
}
}
<!-- end snippet -->
I can see in my console a fine result :
<!-- begin snippet: js hide: false console: true babel: false -->
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"]}}
<!-- end snippet -->
Now comes the issue : the ElasticSearch URL is redirected (for example, in front of Apache, Nginx or F5 ...)
The URL becomes : http://192.168.75.197:8060/v1/es/
This new URL is valid :
1. change only URL
I adapt my java code with just new URL (client and request remain the same) :
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-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);
<!-- end snippet -->
The issue is : 404 Not Found
<!-- begin snippet: js hide: false console: true babel: false -->
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
<!-- end snippet -->
2. change URL & client only
I adapt my java code with just new URL and add path to client (request remains the same) :
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-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);
<!-- end snippet -->
The issue is : Unknown host 192.168.75.197/v1/es/
<!-- begin snippet: js hide: false console: true babel: false -->
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
<!-- end snippet -->
3. change URL, client and request
I adapt my java code with just new URL, add path to both client & request :
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-html -->
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);
<!-- end snippet -->
The issue is the exact same as in point #2 above : Unknown host 192.168.75.197/v1/es/
4. change URL & request only
I adapt my java code with just new URL and add path to request (client remains the same) :
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-html -->
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);
<!-- end snippet -->
The issue is the exact same as in point #1 above : 404 Not Found
答案1
得分: 0
最终,答案在这里:[RestHighLevelClient - 访问位于反向代理后面的 Elastic HTTP 终端][1]
因此,我按照以下方式修改了我的代码:
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-java -->
// 实例化 REST 高级客户端
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);
<!-- end snippet -->
[1]: https://discuss.elastic.co/t/resthighlevelclient-accessing-an-elastic-http-endpoint-behind-reverse-proxy/117306/2
英文:
Finally, answer is here : RestHighLevelClient - Accessing an elastic http endpoint behind reverse proxy
So I modified my code this way :
<!-- begin snippet: js hide: false console: true babel: false -->
<!-- language: lang-java -->
// 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);
<!-- end snippet -->
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论