javax.net.ssl.HttpsURLConnection vs org.apache.http.client.HttpClient

javax.net.ssl.HttpsURLConnection vs org.apache.http.client.HttpClient,java,http,httpclient,httpsurlconnection,Java,Http,Httpclient,Httpsurlconnection,我试图从ApacheHttpClient获取响应信息,但没有获得所需的信息。HttpsURLConnection在过去给了我一些问题,我不想使用它。我正试图从对这些库非常了解的人那里获得帮助,并向我提供原因或解决方案 当我尝试用HttpsURLConnection调用URL时,它提供了所有“文档”URL调用,我可以遍历所有 public InputStream getResource(String resource, String username, String password) throw

我试图从ApacheHttpClient获取响应信息,但没有获得所需的信息。HttpsURLConnection在过去给了我一些问题,我不想使用它。我正试图从对这些库非常了解的人那里获得帮助,并向我提供原因或解决方案

当我尝试用HttpsURLConnection调用URL时,它提供了所有“文档”URL调用,我可以遍历所有

public InputStream getResource(String resource, String username, String password) throws Exception {
        int redirects = 0;

        // Place an upper limit on the number of redirects we will follow
        while (redirects < 10) {
            ++redirects;

            // Configure a connection to the resource server and submit the request for our resource.
            URL url = new URL(resource);
            HttpsURLConnection connection = null;
            if (url.getProtocol().equalsIgnoreCase("https")) {
                connection = (HttpsURLConnection) url.openConnection();
            } else {
                connection = (HttpsURLConnection) new URL("https", url.getAuthority(), url.getFile()).openConnection();
            }
            connection.setRequestMethod("GET");
            connection.setInstanceFollowRedirects(false);
            connection.setUseCaches(false);
            connection.setDoInput(true);

            // If this is the URS server, add in the authentication header.
            if (resource.startsWith(URS)) {
                connection.setDoOutput(true);
                connection.setRequestProperty("Authorization",
                        "Basic " + Base64.getEncoder().encodeToString((username + ":" + password).getBytes()));
            }

            if (connection.getResponseCode() == 200) {
                return connection.getInputStream();
            }

            if (connection.getResponseCode() != 302) {
                throw new Exception("Invalid response from server - status " + connection.getResponseCode());
            }
            
            resource = connection.getHeaderField("Location");
        }
        
        throw new Exception("Redirection limit exceeded");
    }
public InputStream getResource(字符串资源、字符串用户名、字符串密码)引发异常{
int重定向=0;
//对我们将遵循的重定向数量设置上限
while(重定向<10){
++重定向;
//配置与资源服务器的连接,并提交资源请求。
URL=新的URL(资源);
HttpsURLConnection连接=null;
if(url.getProtocol().equalsIgnoreCase(“https”)){
connection=(HttpsURLConnection)url.openConnection();
}否则{
连接=(HttpsURLConnection)新URL(“https”,URL.getAuthority(),URL.getFile()).openConnection();
}
connection.setRequestMethod(“GET”);
connection.setInstanceFollowDirections(false);
connection.setUseCaches(false);
connection.setDoInput(true);
//如果这是URS服务器,请添加身份验证标头。
if(资源启动(URS)){
connection.setDoOutput(真);
connection.setRequestProperty(“授权”,
“Basic”+Base64.getEncoder().encodeToString((用户名+”:“+密码).getBytes());
}
if(connection.getResponseCode()==200){
返回连接。getInputStream();
}
if(connection.getResponseCode()!=302){
抛出新异常(“来自服务器的无效响应-状态”+connection.getResponseCode());
}
resource=connection.getHeaderField(“位置”);
}
抛出新异常(“超出重定向限制”);
}
。。。使用这段代码,我可以迭代每个url,然后发送基本身份验证,然后登录页面。之后,我会在其他时间打电话获取信息

通过HttpsURLConnection,我得到了这两个文档,我刚刚读到了第一个文档的“位置”。然后我回忆起基本的作者

如果我尝试对org.apache.http.client.HttpClient执行相同的操作

public Optional<HttpPayloadResponse> getResource(String resource, String username, String password) throws Exception {
        int redirects = 0;

        // Place an upper limit on the number of redirects we will follow
        while (redirects < 10) {
            ++redirects;
            
            BasicHttpQuery basicHttpQuery = new BasicHttpQuery();
            basicHttpQuery.setTimeOutMillis(20000);
            basicHttpQuery.setHttpRequestType(HttpRequestTypeEnum.GET);
            basicHttpQuery.setUrl(resource);
            basicHttpQuery.setTimeOutMillis(30000);
            
            Optional<HttpPayloadResponse> response = EoHttpClient.executeHttpQuery(basicHttpQuery);
            
            if (response.get().getResponseHeaders().get("Location").equals(URL_FILE_2_DOWNLOAD)) {
                return response;
            } else {
                // If this is the URS server, add in the authentication header.
                if (resource.startsWith(URS)) {
                    basicHttpQuery.getHttpHeader().put("Authorization", 
                            "Basic " + Base64.getEncoder().encodeToString((username + ":" + password).getBytes()));
                }
                
                resource = response.get().getResponseHeaders().get("Location");
            }
        }
        
        throw new Exception("Redirection limit exceeded");
    }
public可选getResource(字符串资源、字符串用户名、字符串密码)引发异常{
int重定向=0;
//对我们将遵循的重定向数量设置上限
while(重定向<10){
++重定向;
BasicHttpQuery BasicHttpQuery=新的BasicHttpQuery();
basicHttpQuery.setTimeOutMillis(20000);
basicHttpQuery.setHttpRequestType(HttpRequestTypeEnum.GET);
basicHttpQuery.setUrl(资源);
basicHttpQuery.setTimeOutMillis(30000);
可选响应=EoHttpClient.executeHttpQuery(basicHttpQuery);
if(response.get().getResponseHeaders().get(“Location”).equals(URL\u文件\u 2\u下载)){
返回响应;
}否则{
//如果这是URS服务器,请添加身份验证标头。
if(资源启动(URS)){
basicHttpQuery.getHttpHeader().put(“授权”,
“Basic”+Base64.getEncoder().encodeToString((用户名+”:“+密码).getBytes());
}
resource=response.get().getResponseHeaders().get(“位置”);
}
}
抛出新异常(“超出重定向限制”);
}

try(CloseableHttpClient-httpClient=buildhttpclientnotckessl(archiveQuery.getTimeOutMillis())){
HttpRequestBase httpOperation=null;
if(archiveQuery.getHttpRequestType().equals(HttpRequestTypeEnum.GET)){
httpOperation=newHttpGet(archiveQuery.getUrl());
}否则{
HttpPost-HttpPost=newhttppost(archiveQuery.getUrl());
setEntity(新的StringEntity(archiveQuery.getQueryPayload());
httpOperation=httpPost;
}
对于(Map.Entry currentHeader:archiveQuery.getHttpHeader().entrySet()){
setHeader(currentHeader.getKey(),currentHeader.getValue());
}
try(CloseableHttpResponse response=httpClient.execute(httpOperation)){
公共静态CloseableHttpClient构建HttpClientNotckSSL(int-timeoutMillis)引发异常{
RequestConfig RequestConfig=RequestConfig.custom()。
setConnectTimeout(timeoutMillis).setConnectionRequestTimeout(timeoutMillis).setSocketTimeout(timeoutMillis)。
build();
最终SSLContext SSLContext=新SSLContextBuilder()
.loadTrustMaterial(null,(x509CertChain,authType)->true)
.build();
返回HttpClientBuilder.create()
.setSSLContext(sslContext)
.setConnectionManager(
新建PoollightTPClientConnectionManager(
RegistryBuilder.create()文件
.register(“http”,PlainConnectionSocketFactory.INSTANCE)
.register(“https”,新的SSLConnectionSocketFactory(sslContext,NoopHostnameVerifier.INSTANCE))
.build()
))
.setDefaultRequestConfig(requestConfig)
.build();
}
它只给了我第二次调用,它没有显示我在网络开发浏览器中从navigator看到的所有“文档”调用。为什么?有没有办法
try(CloseableHttpClient httpClient = buildHttpClientNotCheckSsl(archiveQuery.getTimeOutMillis())) {
        
        HttpRequestBase httpOperation = null;
        if (archiveQuery.getHttpRequestType().equals(HttpRequestTypeEnum.GET)) {
            httpOperation = new HttpGet(archiveQuery.getUrl());
        } else {
            HttpPost httpPost = new HttpPost(archiveQuery.getUrl());
            httpPost.setEntity( new StringEntity(archiveQuery.getQueryPayload()));
            httpOperation = httpPost;
        }
        
        for (Map.Entry<String, String> currentHeader : archiveQuery.getHttpHeader().entrySet()) {
            httpOperation.setHeader(currentHeader.getKey(), currentHeader.getValue());
        }
        
        try (CloseableHttpResponse response = httpClient.execute(httpOperation)) {

public static CloseableHttpClient buildHttpClientNotCheckSsl(int timeoutMillis) throws Exception {
     
    RequestConfig requestConfig = RequestConfig.custom().
            setConnectTimeout(timeoutMillis).setConnectionRequestTimeout(timeoutMillis).setSocketTimeout(timeoutMillis).
            build();

    final SSLContext sslContext = new SSLContextBuilder()
            .loadTrustMaterial(null, (x509CertChain, authType) -> true)
            .build();

    return HttpClientBuilder.create()
            .setSSLContext(sslContext)
            .setConnectionManager(
                    new PoolingHttpClientConnectionManager(
                            RegistryBuilder.<ConnectionSocketFactory>create()
                            .register("http", PlainConnectionSocketFactory.INSTANCE)
                            .register("https", new SSLConnectionSocketFactory(sslContext,NoopHostnameVerifier.INSTANCE))
                            .build()
                            ))
            .setDefaultRequestConfig(requestConfig)
            .build();
}
public static void main(String[] args) throws IOException {

    HttpGet request = new HttpGet("https://cddis.nasa.gov/archive/products/iers/finals2000A.data");

    try (CloseableHttpClient httpClient = HttpClientBuilder.create().disableRedirectHandling().build();
         CloseableHttpResponse response = httpClient.execute(request)) {

        // Get HttpResponse Status
        System.out.println(response.getProtocolVersion());              // HTTP/1.1
        System.out.println(response.getStatusLine().getStatusCode());   // 301
        System.out.println(response.getStatusLine().getReasonPhrase()); // Moved Permanently
        System.out.println(response.getStatusLine().toString());        // HTTP/1.1 301 Moved Permanently

        HttpEntity entity = response.getEntity();
        if (entity != null) {
            // return it as a String
            String result = EntityUtils.toString(entity);
            System.out.println(result);
        }

    }

}