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

最初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();
}
相關文章
相關標籤/搜索