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

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

HttpContext能包含任意对象,因此,可能不是线程安全的。建议每个执行线程维护自己的上下文。

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

  • HttpConnection:它代表连接到目标服务器的实际连接。
  • HttpHost:它代表连接目标。
  • HttpRoute:它代表一个完整的连接路由。
  • HttpRequest:它代表一个真实的HTTP请求。在上下文中的最后的HttpRequest对象总是代表一个精确的消息状态被发送到目标服务器。默认的HTTP1.0和HTTP1.1使用相对的请求URI,然而请求是在非隧道模式中通过代理发送的,那么它是绝对URI。
  • HttpResponse:它代表当前的HTTP响应。
  • 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();
}
时间: 2024-10-26 17:33:55

Httpclient4.4之原理(Http执行上下文)的相关文章

执行上下文对象的原理及使用

执行上下文对象: 在浏览器执行javascript代码之前,浏览器会做一些准备工作(从准备工作这一操作开始,直到对应的这一作用域的所有代码被执行完,这样的一个过程就叫做执行上下文;执行上下文可以被看成一个对象,这个对象 就是用来管理其对应作用域中的各个数据,这些数据就是对象中的属性). 一. 全局作用域中的一些准备工作     1. 找到标记的全局变量,并为其赋值为undefined;     2. 给this赋值为window对象     3. 函数声明,并给函数赋值为整个函数块 二. 函数作

JavaScript内部原理系列-执行上下文(Execution Context)

概要 本文将向大家介绍ECMAScript的执行上下文以及相关的可执行代码类型. 定义 每当控制器到达ECMAScript可执行代码的时候,控制器就进入了一个执行上下文.执行上下文(简称:EC)是个抽象的概念,ECMA-262标准中用它来区分不同类型的可执行代码. 标准中并没有从技术实现的角度来定义执行上下文的具体结构和类型:这是实现标准的ECMAScript引擎所要考虑的问题. 一系列活动的执行上下文从逻辑上形成一个栈.栈底总是全局上下文,栈顶是当前(活动的)执行上下文.当在不同的执行上下文间

【HttpClient4.5中文教程】【第一章 :基础】1.3 HttpClient执行上下文

1.3.Http执行上下文(context) 最初,HTTP是被设计成无状态的,面向请求-响应的协议.然而,现实世界中的应用程序经常需要通过一些逻辑相关的请求-响应交换来保持状态信息. 为了使应用程序能够维持一个过程状态, HttpClient允许HTTP请求在一个特定的执行上下文中来执行--称为HTTP上下文.如果相同的上下文在连续请求之间重用,那么多种逻辑相关的请求可以参与到一个逻辑会话中.HTTP上下文功能和java.util.Map<String,Object>很相似. 它仅仅是任意命

Javascript 执行上下文 context&amp;scope

执行上下文(Execution context) 执行上下文可以认为是 代码的执行环境. 1 当代码被载入的时候,js解释器 创建一个 全局的执行上下文. 2 当执行函数时,会创建一个 函数的执行上下文. 3 当执行 eval()的时候,创建 一个 eval 执行上下文. # if,for,while 等块不会创建 execution context,从而不会创建 scope. 当js解释器开始工作的时候: 1 首先创建一个 执行上下文栈(后进先出) 2 接着创建一个 全局的执行上下文,并放入执

了解JavaScript的执行上下文

转自http://www.cnblogs.com/yanhaijing/p/3685310.html 什么是执行上下文? 当JavaScript代码运行,执行环境非常重要,有下面几种不同的情况: 全局代码--你的代码首次执行的默认环境. 函数代码--每当进入一个函数内部. Eval代码--eval内部的文本被执行时. 在网上你能读到许多关于作用域(scope)的资源,本文的目的是让事情变得更简单,让我们将术语执行上下文想象为当前被执行代码的环境/作用域.说的够多了,现在让我们看一个包含全局和函数

JavaScript深入之执行上下文栈

如果要问到 javascript 代码执行顺序的话,想必写过javascript的开发者都会有个直观的印象,那就是顺序执行,例如: var foo = function(){ console.log('foo1') } foo() // foo1 var foo function(){ console.log('foo2') } foo() // foo2 然而去看这段代码: function foo(){ console.log('foo1'); } foo() // foo2 functio

js基础梳理-究竟什么是执行上下文栈(执行栈),执行上下文(可执行代码)?

日常在群里讨论一些概念性的问题,比如变量提升,作用域和闭包相关问题的时候,经常会听一些大佬们给别人解释的时候说执行上下文,调用上下文巴拉巴拉,总有点似懂非懂,不明觉厉的感觉.今天,就对这两个概念梳理一下,加深对js基础核心的理解. 1. 执行上下文(execution context)与可执行代码(execution code) 1.1 首先说一下,可执行代码的类型有哪些: 全局代码:例如加载外部的js文件或者本地标签内的代码.全局代码不包括 function 体内的代码 函数代码:functi

javascript之执行上下文

执行上下文 一个执行上下文可以抽象成一个简单对象.每个执行上下文有系列的属性(我们可以叫做上下文的状态)来跟踪关联代码的处理. 下面的图是一个上下文的结构: 除了这三个必须的属性(变量对象,this对象和作用域链),一个执行上下文可能有其他的附加状态依赖于实现.

JS高级 -- 执行上下文与作用域链

这个问题涉及到三个点: 1. 执行上下文 2. 函数嵌套导致的执行上下文栈 3.闭包 1 <script> 2 var a = 1; 3 var f1 = function(){//第一个函数 4 var a = 2; 5 var b = 1; 6 7 var f2 = function(){//第二个函数 8 var c = 1; 9 var f3 = function(){//第三个函数 //第三个函数执行,他自己的执行上下文中没有a,b,c,则从父级函数f2的执行上下文中去找,f2中有c