最初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(); }