Httpclient4.4之原理(Http执行上下文)

最初HTTP被设计为无状态的。然而,真实的应用中经常要可以经过几个逻辑相关的请求/响应保持状态信息。为了使应用程序可以保持一个处理状态,HttpClient容许HTTP请求在特定的执行上下文内执行,称为HTTP上下文。若是相同的上下文在连续的请求之间重用,多个逻辑相关的连续请求能够参与一个逻辑会话。HTTP上下文的功能相似于java.util.Map<String,Object>,它只不过是任意命名的值的集合。应用程序能在请求执行以前填充上下文属性,也能在请求执行完成以后检查上下文。java

HttpContext能包含任意对象,所以,可能不是线程安全的。建议每一个执行线程维护本身的上下文。安全

在HTTP请求执行的过程当中,HttpClient添加如下属性到执行上下文:服务器

  • HttpConnection:它表明链接到目标服务器的实际链接。ui

  • HttpHost:它表明链接目标。线程

  • HttpRoute:它表明一个完整的链接路由。设计

  • HttpRequest:它表明一个真实的HTTP请求。在上下文中的最后的HttpRequest对象老是表明一个精确的消息状态被发送到目标服务器。默认的HTTP1.0和HTTP1.1使用相对的请求URI,然而请求是在非隧道模式中经过代理发送的,那么它是绝对URI。代理

  • HttpResponse:它表明当前的HTTP响应。code

  • java.lang.Boolean:它表明一个标志,标识当前请求是否已经被彻底传送到链接目标。对象

  • RequestConfig:它表明当前请求的配置。
    路由

  • java.util.List<URI>:它表明在请求执行过程当中接收到的全部重定向地址的集合。

咱们可使用HttpClientContext适配器类来简化与上下文状态之间的相互做用:

HttpContext context = <...>
HttpClientContext clientContext = HttpClientContext.adapt(context);
HttpHost target = clientContext.getTargetHost();
HttpRequest request = clientContext.getRequest();
HttpResponse response = clientContext.getResponse();
RequestConfig config = clientContext.getRequestConfig();

表明一个逻辑相关会话的多请求序列应执行在同一个HttpContext实体中,确保会话上下文与状态信息在请求间自动传播(示例衔接上面的示例):

CloseableHttpClient httpclient = HttpClients.createDefault();
RequestConfig requestConfig = RequestConfig.custom().
    setSocketTimeout(1000).setConnectTimeout(1000).build();
HttpGet httpget1 = new HttpGet("http://localhost/1");
httpget1.setConfig(requestConfig);
//context上个示例中定义了
CloseableHttpResponse response1 = httpclient.execute(httpget1, context);
try {
    HttpEntity entity1 = response1.getEntity();
} finally {
    response1.close();
}
HttpGet httpget2 = new HttpGet("http://localhost/2");
CloseableHttpResponse response2 = httpclient.execute(httpget2, context);
try {
    HttpEntity entity2 = response2.getEntity();
} finally {
    response2.close();
}
相关文章
相关标签/搜索