HttpClient 教程 (六)

來源:互聯網
上載者:User
第六章 進階主題6.1 自訂用戶端串連

在特定條件下,也許需要來定製HTTP報文通過線路傳遞,越過了可能使用的HTTP參數來處理非標準不相容行為的方式。比如,對於Web爬蟲,它可能需要強制HttpClient接受格式錯誤的回應標頭部資訊,來搶救報文的內容。

通常插入一個自訂的報文解析器的過程或定製串連實現需要幾個步驟:

提供一個自訂LineParser/LineFormatter介面實現。如果需要,實現報文解析/格式化邏輯。

class MyLineParser extends BasicLineParser {@Overridepublic Header parseHeader(final CharArrayBuffer buffer) throws ParseException {try {return super.parseHeader(buffer);} catch (ParseException ex) {// 壓制ParseException異常return new BasicHeader("invalid", buffer.toString());}}}

提過一個自訂的OperatedClientConnection實現。替換需要自訂的預設請求/響應解析器,請求/響應格式化器。如果需要,實現不同的報文寫入/讀取代碼。

class MyClientConnection extends DefaultClientConnection {@Overrideprotected HttpMessageParser createResponseParser(final SessionInputBuffer buffer,final HttpResponseFactory responseFactory,final HttpParams params) {return new DefaultResponseParser(buffer,new MyLineParser(),responseFactory,params);}}

為了建立新類的串連,提供一個自訂的ClientConnectionOperator介面實現。如果需要,實現不同的通訊端初始化代碼。

class MyClientConnectionOperator extendsDefaultClientConnectionOperator {public MyClientConnectionOperator(final SchemeRegistry sr) {super(sr);}@Overridepublic OperatedClientConnection createConnection() {return new MyClientConnection();}}

為了建立新類的串連操作,提供自訂的ClientConnectionManager介面實現。

class MyClientConnManager extends SingleClientConnManager {public MyClientConnManager(final HttpParams params,final SchemeRegistry sr) {super(params, sr);}@Overrideprotected ClientConnectionOperator createConnectionOperator(final SchemeRegistry sr) {return new MyClientConnectionOperator(sr);}}
6.2 有狀態的HTTP串連HTTP規範假設session狀態資訊通常是以HTTP cookie格式嵌入在HTTP報文中的,因此HTTP串連通常是無狀態的,這個假設在現實生活中通常是不對的。也有一些情況,當HTTP串連使用特定的使用者標識或特定的安全上下文來建立時,因此不能和其它使用者共用,只能由該使用者重用。這樣的有狀態的HTTP串連的樣本就是NTLM認證串連和使用用戶端認證認證的SSL串連。6.2.1 使用者令牌處理器HttpClient依賴UserTokenHandler介面來決定給定的執行內容是否是使用者指定的。如果這個上下文是使用者指定的或者如果上下文沒有包含任何資源或關於目前使用者指定詳情而是null,令牌對象由這個處理器返回,期望唯一地標識當前的使用者。使用者令牌將被用來保證使用者指定資源不會和其它使用者來共用或重用。

如果它可以從給定的執行內容中來獲得,UserTokenHandler介面的預設實現是使用主類的一個執行個體來代表HTTP串連的狀態物件。UserTokenHandler將會使用基於如NTLM或開啟的用戶端認證SSL會話認證模式的使用者的主串連。如果二者都不可用,那麼就不會返回令牌。

如果預設的不能滿足它們的需要,使用者可以提供一個自訂的實現:
DefaultHttpClient httpclient = new DefaultHttpClient();httpclient.setUserTokenHandler(new UserTokenHandler() {public Object getUserToken(HttpContext context) {return context.getAttribute("my-token");}});
6.2.2 使用者令牌和執行內容在HTTP請求執行的過程中,HttpClient添加了下列和使用者標識相關的對象到執行內容中:

'http.user-token':對象執行個體代表真實的使用者標識,通常期望Principle介面的執行個體。

我們可以在請求被執行後,通過檢查本地HTTP內容相關的內容,發現是否用於執行請求的串連是有狀態的。
DefaultHttpClient httpclient = new DefaultHttpClient();HttpContext localContext = new BasicHttpContext();HttpGet httpget = new HttpGet("http://localhost:8080/");HttpResponse response = httpclient.execute(httpget, localContext);HttpEntity entity = response.getEntity();if (entity != null) {entity.consumeContent();}Object userToken = localContext.getAttribute(ClientContext.USER_TOKEN);System.out.println(userToken);
6.2.2.1 持久化有狀態的串連請注意帶有狀態物件的持久化串連僅當請求被執行時,相同狀態物件被綁定到執行內容時可以被重用。所以,保證相同上下文重用於執行隨後的相同使用者,或使用者令牌綁定到之前請求執行內容的HTTP請求是很重要的。
DefaultHttpClient httpclient = new DefaultHttpClient();HttpContext localContext1 = new BasicHttpContext();HttpGet httpget1 = new HttpGet("http://localhost:8080/");HttpResponse response1 = httpclient.execute(httpget1, localContext1);HttpEntity entity1 = response1.getEntity();if (entity1 != null) {entity1.consumeContent();}Principal principal = (Principal) localContext1.getAttribute(ClientContext.USER_TOKEN);HttpContext localContext2 = new BasicHttpContext();localContext2.setAttribute(ClientContext.USER_TOKEN, principal);HttpGet httpget2 = new HttpGet("http://localhost:8080/");HttpResponse response2 = httpclient.execute(httpget2, localContext2);HttpEntity entity2 = response2.getEntity();if (entity2 != null) {entity2.consumeContent();}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.