Java Apache HTTPClient Tutorial 深度學習(一)

Apache HTTPClient Tutorial 深度學習(一)

    超文本傳輸協議(HTTP)可能是當今Internet上使用的最重要的協議。Web服務、網絡支持的設備和網絡計算的增長繼續擴展了HTTP協議在用戶驅動的Web瀏覽器之外的作用,同時增加了需要HTTP支持的應用程序的數量。儘管java.net包提供了通過HTTP訪問資源的基本功能,但它並沒有提供許多應用程序所需的全部靈活性或功能。HttpClient通過提供一個有效的、最新的、功能豐富的包來實現這一空白,它實現了最新HTTP標準和建議的客戶端。在爲基礎HTTP協議提供強大支持的同時,HttpClient可能對構建HTTP敏感的客戶端應用程序有興趣,比如web瀏覽器、web服務客戶端,或者利用或擴展HTTP協議來進行分佈式通信的系統。


1. HttpClient 應用範圍
     HTTP客戶端傳輸是基於HttpCore類  [http://hc.apache.org/httpcomponents-core/index.html]
    • 基於 I/O 阻塞
    • 內容不可見

2. HttpClient 不支持的地方
    • HttpClient並不是一個瀏覽器。它是一個客戶端HTTP傳輸庫。HttpClient的目的是傳輸和接收HTTP消息。HttpClient不會嘗試處理內容,在HTML頁面中執行javascript,嘗試猜測內容類型,如果不是顯式設置,或者重新格式化請求/重寫位置uri,或者其他與HTTP傳輸無關的功能。

一、基本原理
    1.1. Request execution
        HttpClient最基本的功能是執行HTTP方法。HTTP方法的執行包含一個或多個HTTP請求/HTTP響應交換,通常由內部處理HttpClient。預期用戶將提供一個要執行的請求對象,並且預計HttpClient將被執行將請求發送到目標服務器,返回對應的響應對象,或拋出異常如果執行成功。
        很自然地,HttpClient API的主要入口點是定義了HttpClient接口的HttpClient接口合同上面所描述的。下面是一個以最簡單的形式請求執行過程的例子:
 

      1.1.1. HTTP request
            所有HTTP請求都有一個請求行,其中包括一個方法名、一個請求URI和一個HTTP協議的版本。
            HttpClient支持在HTTP/1.1規範中定義的所有HTTP方法:GET,頭、POST、PUT、DELETE、TRACE和OPTIONS。每個方法類型都有一個特定的類。:HttpGet,HttpHead、HttpPost、HttpPut、HttpDelete、HttpTrace和http pop彈出。
            請求-uri是一種統一的資源標識符,用於標識要應用的資源請求。HTTP請求uri由協議方案、主機名、可選端口、資源路徑組成,可選的查詢和可選的片段。

    HttpClient提供URIBuilder實用程序類來簡化請求uri的創建和修改。

       

     1.1.2. HTTP response 
        HTTP響應是服務器在接收和解釋後發送給客戶機的一條消息一個請求消息。該消息的第一行包含了協議版本,後面是一個數字狀態代碼及其相關的文本短語。
 

      1.1.3. Working with message headers 
            HTTP消息可以包含許多描述消息屬性的頭信息,比如內容長度、內容類型等。HttpClient提供了檢索、添加、刪除和刪除的方法列舉頭。



        1.1.4. HTTP entity 
        HTTP消息可以攜帶與請求或響應相關聯的內容實體。實體可以找到在一些請求和一些響應中,因爲它們是可選的。使用實體的請求被引用作爲包含請求的實體。HTTP規範定義了包含請求方法的兩個實體:POST和PUT。
響應通常被期望包含一個內容實體。這裏也有例外比如對HEAD方法的響應和204,沒有內容,304 Not修改,205重置內容響應。
        HttpClient區分三種實體,這取決於它們的內容來源:
                     streamed: 內容是從一個流中接收的,或者是動態生成的。特別是,這類別包括從HTTP響應接收的實體。一般來說,流媒體是不存在的可重複的。
                     self-contained: 內容在記憶中或者通過獨立於a的方式獲得連接或其他實體。自包含的實體通常是可重複的。這種類型的實體將會主要用於包含HTTP請求的實體。
                     wrapping: 內容是從另一個實體獲得的。
                當從HTTP中流出內容時,這種區別對於連接管理非常重要響應。對於由應用程序創建的請求實體,並且僅使用HttpClient發送。流和自包含之間的差異是不重要的。在這種情況下,建議將不可重複的實體看作是流的,而那些可重複的實體則是自包含的。

        1.1.5. Ensuring release of low level resources
        爲了確保系統資源的正確發佈,必須關閉與內容流相關的內容流對於實體或響應本身

    關閉內容流和關閉響應之間的區別在於前者將會試圖通過使用實體內容來保持底層連接的存在立即關閉並丟棄連接。請注意,也需要HttpEntity writeto(OutputStream)方法來確保正確一旦實體被完全寫出,系統資源就被釋放。如果該方法獲得一個實例io。
    通過調用HttpEntity getcontent()來調用InputStream,它也將關閉流在最後條款。當使用流媒體實體時,可以使用有權使用的(HttpEntity)方法爲了確保實體內容已經被完全消耗,並且底層的流已經被關閉。但是,當整個響應內容中只有一小部分需要時,可能會出現一些情況檢索和執行對剩餘內容和連接的性能損失可重用性過高,在這種情況下,通過關閉響應,可以終止內容流。

    該連接將不會被重用,但是它所持有的所有級別資源將被正確地釋放。

        1.1.6. Consuming entity content(消費者)
        使用它的HttpEntity getcontent(),使用實體的內容的推薦方法是或HttpEntity #用writeTo(OutputStream)方法。
HttpClient還附帶了“有權”的類,它公開了幾個靜態方法,以便更容易地從一個實體讀取內容或信息。而不是讀取java.io。
輸入流直接,可以在a中檢索整個內容體使用來自這個類的方法的字符串/字節數組。然而,對有權的使用是強烈的除非響應實體來自一個受信任的HTTP服務器,並且被認爲是不受鼓勵的有限的長度。

    在某些情況下,可能需要多次讀取實體內容。在這種情況下實體內容必須以某種方式緩衝,無論是在內存還是在磁盤上。最簡單的方法通過將原始實體包裝成BufferedHttpEntity類來完成這一任務。這將導致將原始實體的內容讀入內存中的緩衝區。在其他方面,實體包裝器將會有最初的那個。


        1.1.7. Producing entity content(生產者) 
        HttpClient提供了幾個類,這些類可以用來高效地通過HTTP來傳輸內容連接。這些類的實例可以與實體封閉請求相關聯,例如POST和PUT將實體內容封裝到傳出的HTTP請求中。HttpClient提供對於大多數常用的數據容器,例如字符串、字節數組、輸入流和文件:StringEntity、ByteArrayEntity、InputStreamEntity和FileEntity。

    請注意InputStreamEntity是不可重複的,因爲它只能從底層數據讀取流一次。通常建議實現一個自包含的自定義的HttpEntity類而不是使用通用的inputstream實體。FileEntity是一個很好的起點。

        1.1.8. Response handlers(相應處理程序) 
        處理響應的最簡單和最方便的方法是使用ResponseHandler接口,其中包括handleResponse(響應)方法。這個方法
完全使用戶不必擔心連接管理。當使用一個ResponseHandler,HttpClient將自動負責確保連接的釋放對於連接管理器,不管請求執行是成功還是導致異常。



About Me:


 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章