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

来源:互联网 发布:崔恺 知乎 编辑:程序博客网 时间:2024/05/28 15:06

1.3.Http执行上下文(context)


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


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


在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适配器类来简化上下文状态的活动。
[java] view plain copy
print?
  1. HttpContext context = <…>  
  2. HttpClientContext clientContext = HttpClientContext.adapt(context);  
  3. HttpHost target = clientContext.getTargetHost();  
  4. HttpRequest request = clientContext.getRequest();  
  5. HttpResponse response = clientContext.getResponse();  
  6. RequestConfig config = clientContext.getRequestConfig();  
HttpContext context = <...>HttpClientContext clientContext = HttpClientContext.adapt(context);HttpHost target = clientContext.getTargetHost();HttpRequest request = clientContext.getRequest();HttpResponse response = clientContext.getResponse();RequestConfig config = clientContext.getRequestConfig();

  
代表一个逻辑相关的会话中的多个请求序列应该被同一个HttpContext实例执行,以确保请求之间会话上下文和状态信息的自动传输。
 
下面的例子中:请求配置在最初被初始化,它将在执行上下文中一直保持。共享与同一个会话中所有连续的请求。
[java] view plain copy
print?
  1.  CloseableHttpClient httpclient = HttpClients.createDefault();  
  2. RequestConfig requestConfig = RequestConfig.custom()  
  3.     .setSocketTimeout(1000)  
  4.     .setConnectTimeout(1000)  
  5.     .build();  
  6. HttpGet httpget1 = new HttpGet(“http://localhost/1”);  
  7. httpget1.setConfig(requestConfig);  
  8. CloseableHttpResponse response1 = httpclient.execute(httpget1, context);  
  9. try {  
  10.     HttpEntity entity1 = response1.getEntity();  
  11. finally {  
  12.     response1.close();  
  13. }  
  14. HttpGet httpget2 = new HttpGet(“http://localhost/2”);  
  15. CloseableHttpResponse response2 = httpclient.execute(httpget2, context);  
  16. try {  
  17.     HttpEntity entity2 = response2.getEntity();  
  18. finally {  
  19.     response2.close();  
  20. }   
 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();} 

=========================总结======================

  
[java] view plain copy
print?
  1. import java.util.List;  
  2.   
  3. import org.apache.http.client.CookieStore;  
  4. import org.apache.http.client.methods.CloseableHttpResponse;  
  5. import org.apache.http.client.methods.HttpGet;  
  6. import org.apache.http.client.protocol.HttpClientContext;  
  7. import org.apache.http.cookie.Cookie;  
  8. import org.apache.http.impl.client.BasicCookieStore;  
  9. import org.apache.http.impl.client.CloseableHttpClient;  
  10. import org.apache.http.impl.client.HttpClients;  
  11. import org.apache.http.util.EntityUtils;  
  12.   
  13. /** 
  14.  * This example demonstrates the use of a local HTTP context populated with 
  15.  * custom attributes. 
  16.  */  
  17. public class ClientCustomContext {  
  18.   
  19.     public final static void main(String[] args) throws Exception {  
  20.         CloseableHttpClient httpclient = HttpClients.createDefault();  
  21.         try {  
  22.             // Create a local instance of cookie store  
  23.             CookieStore cookieStore = new BasicCookieStore();  
  24.   
  25.             // Create local HTTP context  
  26.             HttpClientContext localContext = HttpClientContext.create();  
  27.             // Bind custom cookie store to the local context  
  28.             localContext.setCookieStore(cookieStore);  
  29.   
  30.             HttpGet httpget = new HttpGet(“http://localhost/”);  
  31.             System.out.println(”Executing request ” + httpget.getRequestLine());  
  32.   
  33.             // Pass local context as a parameter  
  34.             CloseableHttpResponse response = httpclient.execute(httpget, localContext);  
  35.             try {  
  36.                 System.out.println(”—————————————-“);  
  37.                 System.out.println(response.getStatusLine());  
  38.                 List<Cookie> cookies = cookieStore.getCookies();  
  39.                 for (int i = 0; i < cookies.size(); i++) {  
  40.                     System.out.println(”Local cookie: ” + cookies.get(i));  
  41.                 }  
  42.                 EntityUtils.consume(response.getEntity());  
  43.             } finally {  
  44.                 response.close();  
  45.             }  
  46.         } finally {  
  47.             httpclient.close();  
  48.         }  
  49.     }  
  50.   
  51. }  
import java.util.List;import org.apache.http.client.CookieStore;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.protocol.HttpClientContext;import org.apache.http.cookie.Cookie;import org.apache.http.impl.client.BasicCookieStore;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.util.EntityUtils;/** * This example demonstrates the use of a local HTTP context populated with * custom attributes. */public class ClientCustomContext {    public final static void main(String[] args) throws Exception {        CloseableHttpClient httpclient = HttpClients.createDefault();        try {            // Create a local instance of cookie store            CookieStore cookieStore = new BasicCookieStore();            // Create local HTTP context            HttpClientContext localContext = HttpClientContext.create();            // Bind custom cookie store to the local context            localContext.setCookieStore(cookieStore);            HttpGet httpget = new HttpGet("http://localhost/");            System.out.println("Executing request " + httpget.getRequestLine());            // Pass local context as a parameter            CloseableHttpResponse response = httpclient.execute(httpget, localContext);            try {                System.out.println("----------------------------------------");                System.out.println(response.getStatusLine());                List<Cookie> cookies = cookieStore.getCookies();                for (int i = 0; i < cookies.size(); i++) {                    System.out.println("Local cookie: " + cookies.get(i));                }                EntityUtils.consume(response.getEntity());            } finally {                response.close();            }        } finally {            httpclient.close();        }    }}


阅读全文
0 0
原创粉丝点击