《HttpClient官方文档》1.3 HTTP执行上下文

1.3 HTTP执行上下文

HTTP起初是被设计成一种无状态的、面向请求和响应的协议。然而实际的应用经常需要在请求-响应切换过程中保存状态信息。为了使应用能够维持处理状态,HttpClient允许HTTP请求可以在一个特殊的上下文环境(HttpContext)中执行。如果一个context在连续的HTTP请求中被复用,那么这些逻辑相关的请求可以参与到同一个逻辑会话中。HttpContext功能与java.util.Map<String, Object>类似,它是一组任意值的集合。一个应用程序可以在请求执行之前填充上下文属性或者在请求执行完成后检查上下文。

HttpContext可以保存多个对象,因而它在多个线程共享时可能并不安全。这里推荐每个线程维持各自HttpContext。

在HTTP请求执行的过程中,HttpClient向context添加了以下属性:

  • HttpConnection,表示与目标服务器的实际连接
  • HttpHost,表示连接的目标
  • HttpRoute,表示完整的连接路由
  • HttpRequest,表示Http请求
  • HttpResponse,表示Http响应
  • 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);

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();

}

 转载自 并发编程网 - ifeve.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值