elasticsearch,redirect,Java,Rest,elasticsearch,Redirect" /> elasticsearch,redirect,Java,Rest,elasticsearch,Redirect" />

Java 通过重定向URL搜索REST HTTP请求

Java 通过重定向URL搜索REST HTTP请求,java,rest,elasticsearch,redirect,Java,Rest,elasticsearch,Redirect,我请求社区帮助是因为我在请求带有特殊重定向URL的ElasticSearch数据库时遇到了一些问题 你能帮个忙吗 多谢各位 首先,让我们从一个好的案例开始 假设我有一个标准的ElasticSearch URL: 使用ElasticSearch文档: 我可以使用以下Java代码请求它: package com.acme.elasticsearch; 导入java.net.URL; 导入org.apache.http.HttpHost; 导入org.apache.http.auth.AuthScop

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

你能帮个忙吗

多谢各位

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

假设我有一个标准的ElasticSearch URL:

使用ElasticSearch文档:

我可以使用以下Java代码请求它:

package com.acme.elasticsearch;
导入java.net.URL;
导入org.apache.http.HttpHost;
导入org.apache.http.auth.AuthScope;
导入org.apache.http.auth.UsernamePasswordCredentials;
导入org.apache.http.client.CredentialsProvider;
导入org.apache.http.impl.client.BasicCredentialsProvider;
导入org.apache.http.impl.nio.client.httpacyncclientbuilder;
导入org.elasticsearch.action.get.GetRequest;
导入org.elasticsearch.action.get.GetResponse;
导入org.elasticsearch.client.RequestOptions;
导入org.elasticsearch.client.RestClient;
导入org.elasticsearch.client.RestClientBuilder;
导入org.elasticsearch.client.RestClientBuilder.HttpClientConfigCallback;
导入org.elasticsearch.client.RestHighLevelClient;
公共类TestRedirect{
私有静态最终字符串rawURL=”http://192.168.75.197:9200";
私有静态最终字符串索引=“demoindex02”;
私有静态最终字符串id=“Zw6AXnEB8ovVkXyeZ9wF”;
公共静态void main(字符串[]args)引发异常{
//解析URL
System.out.println(“URL=“+rawURL”);
URL parsedHttpUrl=新URL(rawURL);
String protocol=parsedHttpUrl.getProtocol();
String host=parsedHttpUrl.getHost();
int port=parsedHttpUrl.getPort();
String path=parsedHttpUrl.getPath();
System.out.println(“协议=”+协议);
System.out.println(“host=“+host”);
System.out.println(“端口=”+端口);
System.out.println(“path=“+path”);
//实例化HTTP凭据
最终凭证提供程序凭证提供程序=新的基本凭证提供程序();
credentialsProvider.setCredentials(AuthScope.ANY,
新用户名密码凭据(Credential.user,Credential.password));
//实例化REST高级客户机
RestClientBuilder RestClientBuilder=RestClient.builder(新的HttpHost(主机、端口、协议));
restClientBuilder.setHttpClientConfigCallback(新的HttpClientConfigCallback(){
@凌驾
公共HttpAsyncClientBuilder自定义HttpClient(HttpAsyncClientBuilder httpClientBuilder){
返回httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});
RestHighLevelClient RestHighLevelClient=新的RestHighLevelClient(restClientBuilder);
//简单获取请求
GetRequest GetRequest=新的GetRequest(索引,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"]}}
现在问题来了:ElasticSearchURL被重定向(例如,在Apache、Nginx或F5之前…)

URL变为:

此新URL有效:

1。仅更改URL

我使用新的URL修改java代码(客户端和请求保持不变):

private静态最终字符串rawURL=”http://192.168.75.197:8060/v1/es/";
RestClientBuilder RestClientBuilder=RestClient.builder(新的HttpHost(主机、端口、协议));
GetRequest GetRequest=新的GetRequest(索引,id);
问题是:找不到404

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
问题是:未知主机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静态最终字符串rawURL=”http://192.168.75.197:8060/v1/es/";
RestClientBuilder RestClientBuilder=RestClient.builder(新的HttpHost(主机+路径、端口、协议));

GetRequest GetRequest=新的GetRequest(路径+索引,id)最后,答案如下:

所以我修改了我的代码:

//实例化REST高级客户端
RestClientBuilder RestClientBuilder=RestClient.builder(新的HttpHost(主机、端口、协议));
restClientBuilder.setHttpClientConfigCallback(新的HttpClientConfigCallback(){
@凌驾
公共HttpAsyncClientBuilder自定义HttpClient(HttpAsyncClientBuilder httpClientBuilder){
返回httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
}
});
setPathPrefix(路径);
RestHighLevelClient RestHighLevelClient=新的RestHighLevelClient(restClientBuilder);