那些青春的歲月
HttpClient接口代表了最重要的HTTP請(qǐng)求執(zhí)行的契約。它沒(méi)有在請(qǐng)求執(zhí)行處理上強(qiáng)加限制或特殊細(xì)節(jié),而在連接管理,狀態(tài)管理,認(rèn)證和處理重定向到具體實(shí)現(xiàn)上留下了細(xì)節(jié)。這應(yīng)該使得很容易使用額外的功能,比如響應(yīng)內(nèi)容緩存來(lái)裝飾接口。
DefaultHttpClient是HttpClient接口的默認(rèn)實(shí)現(xiàn)。這個(gè)類(lèi)扮演了很多特殊用戶(hù)程序或策略接口實(shí)現(xiàn)負(fù)責(zé)處理特定HTTP協(xié)議方面,比如重定向到處理認(rèn)證或做出關(guān)于連接持久化和保持活動(dòng)的持續(xù)時(shí)間決定的門(mén)面。這使得用戶(hù)可以選擇使用定制,具體程序等來(lái)替換某些方面默認(rèn)實(shí)現(xiàn)。
DefaultHttpClient httpclient = new DefaultHttpClient(); httpclient.setKeepAliveStrategy(new DefaultConnectionKeepAliveStrategy() { @Override public long getKeepAliveDuration(HttpResponse response, HttpContext context) { long keepAlive = super.getKeepAliveDuration(response, context); if (keepAlive == -1) { // 如果keep-alive值沒(méi)有由服務(wù)器明確設(shè)置,那么保持連接持續(xù)5秒。 keepAlive = 5000; } return keepAlive; } });
DefaultHttpClient也維護(hù)一組協(xié)議攔截器,意在處理即將離開(kāi)的請(qǐng)求和即將到達(dá)的響應(yīng),而且提供管理那些攔截器的方法。新的協(xié)議攔截器可以被引入到協(xié)議處理器鏈中,或在需要時(shí)從中移除。內(nèi)部的協(xié)議攔截器存儲(chǔ)在一個(gè)簡(jiǎn)單的java.util.ArrayList中。它們以被加入到list中的自然順序來(lái)執(zhí)行。
DefaultHttpClient httpclient = new DefaultHttpClient(); httpclient.removeRequestInterceptorByClass(RequestUserAgent.class); httpclient.addRequestInterceptor(new HttpRequestInterceptor() { public void process( HttpRequest request, HttpContext context) throws HttpException, IOException { request.setHeader(HTTP.USER_AGENT, "My-own-client"); } });
DefaultHttpClient是線(xiàn)程安全的。建議相同的這個(gè)類(lèi)的實(shí)例被重用于多個(gè)請(qǐng)求的執(zhí)行。當(dāng)一個(gè)DefaultHttpClient實(shí)例不再需要而且要脫離范圍時(shí),和它關(guān)聯(lián)的連接管理器必須調(diào)用ClientConnectionManager#shutdown()方法關(guān)閉。
HttpClient httpclient = new DefaultHttpClient(); // 做些有用的事 httpclient.getConnectionManager().shutdown();
HttpClient處理所有類(lèi)型的自動(dòng)重定向,除了那些由HTTP規(guī)范明令禁止的,比如需要用戶(hù)干預(yù)的。參考其它(狀態(tài)碼303)POST和PUT請(qǐng)求重定向轉(zhuǎn)換為由HTTP規(guī)范需要的GET請(qǐng)求。
DefaultHttpClient將HTTP請(qǐng)求視為不變的對(duì)象,也從來(lái)不會(huì)假定在請(qǐng)求執(zhí)行期間改變。相反,它創(chuàng)建了一個(gè)原請(qǐng)求對(duì)象私有的可變副本,副本的屬性可以基于執(zhí)行上下文來(lái)更新。因此,如目標(biāo)主鍵和請(qǐng)求URI的final類(lèi)型的請(qǐng)求參數(shù)可以在請(qǐng)求執(zhí)行之后,由檢查本地HTTP上下文來(lái)決定。
DefaultHttpClient httpclient = new DefaultHttpClient(); HttpContext localContext = new BasicHttpContext(); HttpGet httpget = new HttpGet("http://localhost:8080/"); HttpResponse response = httpclient.execute(httpget, localContext); HttpHost target = (HttpHost) localContext.getAttribute( ExecutionContext.HTTP_TARGET_HOST); HttpUriRequest req = (HttpUriRequest) localContext.getAttribute( ExecutionContext.HTTP_REQUEST); System.out.println("Target host: " + target); System.out.println("Final request URI: " + req.getURI()); System.out.println("Final request method: " + req.getMethod());
Copyright @ abin Powered by: .Text and ASP.NET Theme by: .NET Monster