天天看點

《Http Client 官方文檔》7. 進階主題

在某些情況下,有必要自定義http消息傳輸的方式來擴充http參數的可使用性,以便能夠處理非标準的作業。 例如,對于網絡爬蟲,可能需要強制httpclient接受格式不正确的響應頭,來捕捉消息的内容。

通常,插入自定義消息解析器或自定義連接配接實作的過程涉及幾個步驟:

提供自定義的“lineparser”/“lineformatter”接口實作類。 根據需要實作消息解析/格式化邏輯。

提供自定義的“httpconnectionfactory”接口的實作類。 用自定義的請求寫入器和/或響應解析器根據需要來替換預設的。

配置httpclient來使用自定義連接配接工廠類。

雖然http規範假設會話狀态資訊總是以http cookie的形式嵌入http消息中,是以http連接配接始終是無狀态的,但這種假設在現實生活中并不總是成立。有些情況下,使用特定身份的使用者或在特定的安全上下文内建立的http連接配接是不能與其他使用者共享的,隻能由相同使用者重複使用。有狀态http連接配接的例子是“ntlm”認證的連接配接和具有用戶端證書認證的ssl連接配接。

httpclient依賴于’usertokenhandler’接口來确定給定的執行上下文是否為使用者特定的。如果是,則該處理程式傳回的令牌對象應該唯一辨別目前使用者,如果上下文不包含目前使用者特有的任何資源或詳細資訊,則該對象将為null。 使用者令牌将用于確定使用者特定資源不會被其他使用者共享或重複使用。

‘usertokenhandler’接口的預設實作類作為principal類的執行個體來表示http連接配接的狀态對象,如果它可以從給定的執行上下文獲得的話。

‘defaultusertokenhandler’将使用基于連接配接的認證方案(例如’ntlm’)或使用用戶端認證的ssl會話的使用者主體。 如果兩者都不可用,将傳回null令牌。

如果預設設定不能滿足需要,使用者可以提供自定義實作:

請注意,隻有當執行請求時相同的狀态對象綁定到執行上下文時,攜帶狀态對象的持久連接配接才可重複使用。是以,確定使用者執行後續http請求時重用了相同的上下文或使用者令牌在請求執行之前就被綁定到上下文,是非常重要的。

使用futurerequestexecutionservice,您可以有計劃的調用http并且在未來做出響應。 這是很有用的,例如, 對web服務進行多個調用。使用futurerequestexecutionservice的優點是,您可以使用多個線程來并發排程請求,也可以設定這些任務逾時,或在不再需要響應的時候取消它們。

futurerequestexecutionservice使用擴充了futuretask的httprequestfuturetask類來封裝請求。該類允許您取消任務以及追蹤各個資料,如請求持續時間。

futurerequestexecutionservice類的構造函數接受任何已有的httpclient執行個體和executorservice執行個體。 當配置這兩者時,重要的是将最大連接配接數與要使用的線程數一緻。當線程數超過了最大連接配接數時,因為沒有了可用的連接配接,連接配接将會進入逾時。而出現相反的情況時,futurerequestexecutionservice将不會使用它們

要計劃請求,隻需提供一個httpurirequest,httpcontext和一個responsehandler。 因為請求由執行器服務處理,是以會強制使用responsehandler。

計劃任務有可能被取消。如果任務一直就在隊列中等待執行,那麼它将永遠不會執行。如果它正在執行中并且mayinterruptifrunning參數為true,那麼将在請求上調用abort(); 否則雖然會正常完成請求,但是會忽略響應。任何對task.get()的後續調用都将失敗并傳回illegalstateexception異常。 應當注意,取消任務僅會釋放用戶端資源。 該請求實際上可以在伺服器端正常處理。

如果要代替手動調用task.get(),還可以使用futurecallback執行個體在請求完成時擷取回調, 它與httpasyncclient中使用的接口相同。

futurerequestexecutionservice通常用于進行大量web服務調用的應用程式中。 為了友善監控或配置調整等,futurerequestexecutionservice會追蹤多項資料。

每個httprequestfuturetask提供了擷取任務排程,啟動和結束時間的方法。 此外,請求和任務持續時間也可用。這些資料标準在futurerequestexecutionservice中的futurerequestexecutionmetrics執行個體中聚合,可通過futurerequestexecutionservice.metrics()通路。

繼續閱讀