当前位置: 首页 > 知识库问答 >
问题:

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

孙震博
2023-03-14

我正在使用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个答案

崔琦
2023-03-14

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

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状态响应连接方法。

 类似资料:
  • 我在详细学习http协议时,偶然发现了这个教程。我认为当发出http请求时,会通过客户端(浏览器)和服务器建立TCP连接。在TCP连接上发送http请求数据,在服务器端解析http请求,并在同一TCP连接上发送http响应。发送响应后,TCP连接终止。对于下一个http请求,将建立一个新的TCP连接。但下面的教程说了些别的。我是对还是错?

  • 关于HTTP连接关闭,我有两个问题: > 如果一个客户端通过连接发送一个HTTP请求:靠近HTTP服务器,那么在客户端收到响应后,HTTP服务器还是客户端有责任发送TCP FIN? 如果客户端发送了一个格式错误的HTTP请求,而服务器发送了一个400错误的请求,那么最好的做法是通过服务器关闭连接(即使HTTP请求有connection:keep alive),还是保持连接仍然处于活动状态? 提前感

  • 我正在开发一个与我编写的RESTful网络服务通信的Android应用程序。在GET方法中使用Volley非常简单,但是我不能把我的手指放在POST方法上。 如何从我的post请求响应中获取字段这是我的响应 我想只有"访问令牌"内容 这是我的密码 请帮帮我?!

  • 问题内容: 我试图一起使用以发出POST请求。到目前为止,我的代码: 它工作正常,但是,当发生HTTP错误时,会发出警告: 并返回false。有没有办法: 禁止显示警告(如果发生故障,我打算抛出自己的异常) 从流中获取错误信息(至少是响应代码) 问题答案: http://php.net/manual/en/reserved.variables.httpresponseheader.php

  • 我是iOS和Swift的新手,我正在尝试使用AlamoFire3.4.0来做一个web请求。当我的请求成功时,一切都很好。但是,如果我的请求失败,服务器将返回300或更大的状态代码,以及响应体中的一些JSON,其中包含关于请求失败原因的更多信息。例如,我正在与之交谈的API要求对每个请求进行身份验证。如果身份验证由于某种原因失败,我将返回401,响应体中的JSON将为: 我发出此请求的代码如下所示

  • 虽然,如果我将链接插入浏览器,我将得到json格式。 这就是请求的工作结果 `