HttpClient执行上下文HttpContext

最初,HTTP是被设计成无状态的,面向请求-响应的协议。然而,现实世界中的应用程序经常需要通过一些逻辑相关的请求-响应交换来保持状态信息。 为了使应用程序能够维持一个过程状态, HttpClient允许HTTP请求在一个特定的执行上下文中来执行,称为HTTP上下文。其设计理念为:HttpContext->HttpCoreContext->HttpClientContext

如果相同的上下文在连续请求之间重用,那么多种逻辑相关的请求可以参与到一个逻辑会话中。HTTP上下文功能和java.util.Map<String,Object>很相似。 它仅仅是任意命名参数值的集合。应用程序可以在请求之前填充上下文属性,也可以在执行完成之后来检查上下文属性。

HttpContext能够包含任意的对象,因此在两个不同的线程中共享上下文是不安全的,建议每个线程都一个它自己执行的上下文。

//创建HttpContext上下文
HttpClientContext context = HttpClientContext.create();
//在HttpContext上下文中执行请求
CloseableHttpResponse response = httpClient.execute(httpPost, context);

在HTTP请求执行的这一过程中, HttpClient添加了下列属性到执行上下文中:

  • HttpConnection实例代表连接到目标服务器的当前连接。
  • HttpHost实例代表连接到目标服务器的当前连接。
  • HttpRoute实例代表了完整的连接路由。
  • HttpRequest实例代表了当前的HTTP请求。最终的HttpRequest对象在执行上下文中总是准确代表了状态信息,因为它已经发送给了服务器。每个默认的HTTP/1.0 和 HTTP/1.1使用相对的请求URI,可是,请求以non-tunneling模式通过代理发送时,URI会是绝对的。
  • HttpResponse实例代表当前的HTTP响应。
  • java.lang.Boolean对象是一个标识,它标志着当前请求是否完整地传输给连接目标。
  • RequestConfig代表当前请求配置。
  • java.util.List<URI>对象代表一个含有执行请求过程中所有的重定向地址。

你可以使用HttpClientContext适配器类来简化上下文状态的活动。代表一个逻辑相关的会话中的多个请求序列应该被同一个HttpContext实例执行,以确保请求之间会话上下文和状态信息的自动传输。即使使用同一个HttpContext上下文,HttpContext中的数据是共用的,当前正在执行的请求是可以获取上一个请求的数据中。

猜你喜欢

转载自www.cnblogs.com/myitnews/p/12200379.html