Java 通过重定向URL搜索REST HTTP请求
我请求社区帮助是因为我在请求带有特殊重定向URL的ElasticSearch数据库时遇到了一些问题 你能帮个忙吗 多谢各位 首先,让我们从一个好的案例开始 假设我有一个标准的ElasticSearch URL: 使用ElasticSearch文档: 我可以使用以下Java代码请求它: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
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);