提问者:小点点

Apache HttpComponents。获取连接请求的响应


我正在使用Apache HTTPComponents(版本4.5.2),并试图通过代理服务器请求HTTPS页面。

编辑:

我的主要问题是,我需要知道如何区分代理服务器的故障和请求的URI的故障(对于HTTP和HTTPS)。我有很多代理,它们不是百分之百可靠的,所以在代理失败的情况下,我需要用不同的代理服务器重试请求。

例如(对于HTTPS),在这两种情况下都可以返回NoHttpResponseException,即代理失败或目标URL失败时。我怎么知道问题的根源?NoHttpResponseException是从哪里来的?从目标URI的代理?

我想我可以尝试读取连接到代理服务器的请求的响应,如果它是200,那么这意味着代理是好的,接下来的NoHttpResponseException来自目标URL。但如果我立即得到NoHttpResponseException(在代理为连接返回200个状态码之前),这意味着代理本身存在问题,我需要使用不同的代理服务器重试请求。但我找不到任何文档如何访问代理服务器返回的连接请求的响应。

此外,有时我会得到HttpHostConnectException和ConnectTimeoutException。我将此异常视为代理(HTTP和HTTPS)的问题-这是正确的方法吗?或者即使对于目标URL,也可能发生这2个异常?


共1个答案

匿名用户

它不会很漂亮,但它应该能起到作用

HttpHost myproxy = new HttpHost("myproxy", 8080)
CloseableHttpClient client = HttpClientBuilder.create()
        .setProxy(myproxy)
        .setProxyAuthenticationStrategy(new ProxyAuthenticationStrategy() {

            @Override
            public boolean isAuthenticationRequested(HttpHost authhost, HttpResponse response, HttpContext context) {

                if (myproxy.equals(authhost)) {
                    context.setAttribute("proxy.status", response.getStatusLine());
                }
                return super.isAuthenticationRequested(authhost, response, context);
            }
        })
        .build();

HttpClientContext context = HttpClientContext.create();
HttpGet get = new HttpGet("https://httpbin.org/");
try (CloseableHttpResponse response = client.execute(get, context)) {
    EntityUtils.consume(response.getEntity());
}
StatusLine proxyStatus = context.getAttribute("proxy.status", StatusLine.class);
System.out.println("Proxy said " + proxyStatus);

PS:HttpHostConnectException和ConnectTimeoutException只能在第一个跃点(即连接到代理时)引发异常。如果代理由于任何原因未能连接到目标服务器,则它可能会以5xx状态响应连接方法。