<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    少年阿賓

    那些青春的歲月

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks
    第五章 HTTP客戶(hù)端服務(wù)

    5.1 HttpClient門(mén)面

    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();

    5.2 HttpClient參數(shù)

    這些是可以用于定制默認(rèn)HttpClient實(shí)現(xiàn)行為的參數(shù):
    • 'http.protocol.handle-redirects':定義了重定向是否應(yīng)該自動(dòng)處理。這個(gè)參數(shù)期望得到一個(gè)java.lang.Boolean類(lèi)型的值。如果這個(gè)參數(shù)沒(méi)有被設(shè)置,HttpClient將會(huì)自動(dòng)處理重定向。
    • 'http.protocol.reject-relative-redirect':定義了是否相對(duì)的重定向應(yīng)該被拒絕。HTTP規(guī)范需要位置值是一個(gè)絕對(duì)URI。這個(gè)參數(shù)期望得到一個(gè)java.lang.Boolean類(lèi)型的值。如果這個(gè)參數(shù)沒(méi)有被設(shè)置,那么就允許相對(duì)重定向。
    • 'http.protocol.max-redirects':定義了要遵循重定向的最大數(shù)量。這個(gè)重定向數(shù)字的限制意在防止由破碎的服務(wù)器端腳本引發(fā)的死循環(huán)。這個(gè)參數(shù)期望得到一個(gè)java.lang.Integer類(lèi)型的值。如果這個(gè)參數(shù)沒(méi)有被設(shè)置,那么只允許不多余100次重定向。
    • 'http.protocol.allow-circular-redirects':定義環(huán)形重定向(重定向到相同路徑)是否被允許。HTTP規(guī)范在環(huán)形重定向沒(méi)有足夠清晰的允許表述,因此這作為可選的是可以開(kāi)啟的。這個(gè)參數(shù)期望得到一個(gè)java.lang.Boolean類(lèi)型的值。如果這個(gè)參數(shù)沒(méi)有被設(shè)置,那么環(huán)形重定向就不允許。
    • 'http.connection-manager.factory-class-name':定義了默認(rèn)的ClientConnectionManager實(shí)現(xiàn)的類(lèi)型。這個(gè)參數(shù)期望得到一個(gè)java.lang.String類(lèi)型的值。如果這個(gè)參數(shù)沒(méi)有被設(shè)置,對(duì)于每個(gè)默認(rèn)的將使用SingleClientConnManager。
    • 'http.virtual-host':定義了在頭部信息Host中使用的虛擬主機(jī)名稱(chēng),來(lái)代替物理主機(jī)名稱(chēng)。這個(gè)參數(shù)期望得到一個(gè)HttpHost類(lèi)型的值。如果這個(gè)參數(shù)沒(méi)有被設(shè)置,那么將會(huì)使用目標(biāo)主機(jī)的名稱(chēng)或IP地址。
    • 'http.default-headers':定義了每次請(qǐng)求默認(rèn)發(fā)送的頭部信息。這個(gè)參數(shù)期望得到一個(gè)包含Header對(duì)象的java.util.Collection類(lèi)型值。
    • 'http.default-host':定義了默認(rèn)主機(jī)。如果目標(biāo)主機(jī)沒(méi)有在請(qǐng)求URI(相對(duì)URI)中明確指定,那么就使用默認(rèn)值。這個(gè)參數(shù)期望得到一個(gè)HttpHost類(lèi)型的值。

    5.3 自動(dòng)重定向處理

    HttpClient處理所有類(lèi)型的自動(dòng)重定向,除了那些由HTTP規(guī)范明令禁止的,比如需要用戶(hù)干預(yù)的。參考其它(狀態(tài)碼303)POST和PUT請(qǐng)求重定向轉(zhuǎn)換為由HTTP規(guī)范需要的GET請(qǐng)求。

    5.4 HTTP客戶(hù)端和執(zhí)行上下文

    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());
    http://www.cnblogs.com/loveyakamoz/archive/2011/07/21/2113249.html
    posted on 2012-09-26 16:44 abin 閱讀(1815) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): httpClient
    主站蜘蛛池模板: 免费看少妇作爱视频| 成人黄色免费网址| 在线免费中文字幕| 无码人妻一区二区三区免费手机| 成人免费视频一区| 亚洲精品国产高清不卡在线| 精品国产_亚洲人成在线高清| 久久久久亚洲av无码专区喷水 | 亚洲成A∨人片天堂网无码| 亚洲色成人中文字幕网站| 亚洲美女视频免费| 亚洲av午夜电影在线观看| 成人免费无码H在线观看不卡| 亚洲大片免费观看| 国产极品美女高潮抽搐免费网站| 国产亚洲老熟女视频| 亚洲成人免费网址| 老司机精品视频免费| 日韩精品人妻系列无码专区免费 | 337p日本欧洲亚洲大胆人人 | 国产精品亚洲片在线花蝴蝶| 97国免费在线视频| 国产精品美女午夜爽爽爽免费| 免费播放春色aⅴ视频| 亚洲天堂视频在线观看| 亚洲国产成人AV在线播放| 成人精品一区二区三区不卡免费看| 国产成人午夜精品免费视频| 亚洲精品亚洲人成在线观看下载| 亚洲色偷偷av男人的天堂| 色多多免费视频观看区一区| 免费A级毛片无码专区| 免费看国产一级特黄aa大片| 亚洲最新视频在线观看| 污视频网站在线观看免费| 欧洲一级毛片免费| 中文亚洲AV片不卡在线观看| 亚洲中文字幕无码一去台湾| 东方aⅴ免费观看久久av| 日韩电影免费在线| 久久精品国产亚洲精品2020|