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

如何使用apache java HttpClient 4.5从连接请求中检索响应头?

单于钊
2023-03-14

我使用http代理通过CloseableHttpClient连接https网站。首先发送连接请求,因为它必须进行隧道连接。将发送响应头,我需要检索它们。结果将存储在变量中,稍后使用。

在HttpClient 4.2上,我可以使用HttpResponseInterceptor实现它:

final DefaultHttpClient httpClient = new DefaultHttpClient();
//configure proxy


httpclient.addResponseInterceptor(new HttpResponseInterceptor() {
    public void process(HttpResponse httpResponse, HttpContext httpContext) throws HttpException, IOException {
        final Header[] headers = httpResponse.getAllHeaders();

        //store headers
    }
});

但当我使用HttpClient 4.5时,我的响应拦截器从未在连接请求上被调用。它在GET或POST请求时直接跳转:

 final CloseableHttpClient httpClient = HttpClients.custom()
                .setProxy(new HttpHost(proxyHost, proxyPort, "http"))
                .addInterceptorFirst(new HttpResponseInterceptor() {
                    public void process(HttpResponse httpResponse, HttpContext httpContext) throws HttpException, IOException {
                        final Header[] headers = httpResponse.getAllHeaders();

                        //store headers
                    }
                }).build();

方法setInterceptorLast()setHttpProcencer()的结果相同。提前感谢:)

共有1个答案

阙新觉
2023-03-14

您需要一个自定义的HttpClientBuilder类,以便能够将自定义协议侦听器添加到用于执行连接方法的HTTP协议处理器。

HttpClient 4.5它不漂亮,但它会完成工作:

HttpClientBuilder builder = new HttpClientBuilder() {

    @Override
    protected ClientExecChain createMainExec(
            HttpRequestExecutor requestExec,
            HttpClientConnectionManager connManager,
            ConnectionReuseStrategy reuseStrategy,
            ConnectionKeepAliveStrategy keepAliveStrategy,
            HttpProcessor proxyHttpProcessor,
            AuthenticationStrategy targetAuthStrategy,
            AuthenticationStrategy proxyAuthStrategy,
            UserTokenHandler userTokenHandler) {

        final ImmutableHttpProcessor myProxyHttpProcessor = new ImmutableHttpProcessor(
                Arrays.asList(new RequestTargetHost()),
                Arrays.asList(new HttpResponseInterceptor() {

                    @Override
                    public void process(
                            HttpResponse response,
                            HttpContext context) throws HttpException, IOException {

                    }
                })
        );

        return super.createMainExec(requestExec, connManager, reuseStrategy, keepAliveStrategy,
                myProxyHttpProcessor, targetAuthStrategy, proxyAuthStrategy, userTokenHandler);
    }

};

HttpClient 5.0经典:

CloseableHttpClient httpClient = HttpClientBuilder.create()
        .replaceExecInterceptor(ChainElement.CONNECT.name(),
                new ConnectExec(
                        DefaultConnectionReuseStrategy.INSTANCE,
                        new DefaultHttpProcessor(new RequestTargetHost()),
                        DefaultAuthenticationStrategy.INSTANCE))
        .build();
 类似资料:
  • 问题内容: 如何检索请求的响应标头?以下是我提出的要求。 提前致谢! 问题答案: 如果响应为类型,则可以从获取标头。 因此,当您使用Alamofire responseJSON时,可以像这样访问NSHTTPURLResponse属性: 正如苹果文件所说: 包含所有HTTP标头字段的字典,该字段作为服务器响应的一部分收到。通过检查此词典,客户端可以看到HTTP服务器返回的“原始”标头信息。 该词典中

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

  • 问题内容: 我有两个Python脚本。一种使用Urllib2库,另一种使用Requests库。 我发现请求更容易实现,但是找不到urlib2的等效函数。例如: 建立完发布网址后,请给我内容-我正尝试连接到vcloud Director api实例,并且响应显示了我有权访问的端点。但是,如果我按以下方式使用请求库.... .... the和不返回任何内容,即使请求后调用中的状态代码等于200。 为什

  • 问题内容: 我需要编写一个命令行客户端,以便在服务器上播放井字游戏。服务器接受http请求并将json发送回我的客户端。我正在寻找一种快速的方法,以使用Boost库发送http请求并以字符串形式接收json。 问题答案: 符合说明的最简单的事情: 这将收到完整的响应。您可以使用虚拟服务器对其进行测试:( 也可以 在Coliru上运行): 这将表明已收到请求,并且响应将由上面的客户代码写出。 请注意

  • 我有一个本地服务器在我的计算机上运行,它有一个内置的REST API。api的基本url为:http://127.0.0.1:8090/ehr/api/v1.现在我想用这个api为这个服务器创建一个客户端应用程序。要登录此服务器,api url为baseurl/login with POST method。它将用户名、密码和组织作为参数,如果登录成功,则返回json格式的身份验证令牌。现在我想用h

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