1. 程式人生 > >《Maven官方文件》HttpClient HTTP提供者的先進配置

《Maven官方文件》HttpClient HTTP提供者的先進配置

原文連結   譯者:carvendy

HttpClient HTTP提供者的先進配置

  • HttpClient HTTP提供者的先進配置
    • 注意Maven版本和可用性
      • Maven 2.2.0
      • Maven 2.2.1
      • Maven 3.0.4
    • 介紹
    • 基礎
    • 配置 GET,HEAD,PUT,或者全部。
    • 你的HTTP頭的控制
    • 微調HttpClient引數
      • 非字串值
      • 例子:使用先發制人的認證
      • 忽略Cookies
    • 支援通常提供者配置標準
      • HTTP頭
      • 連線超時
      • 讀超時
    • 資源

注意Maven版本和可用性

Maven 2.2.0

Maven 2.2.0開始,HttpClient提供者已經實現在使用了。剩餘的文件被具體處理使用了不同於HttpClient- and Sun-based HTTP的提供者。

Maven 2.2.1

由於一些批評HttpClient-based HTTP提供者的問題被提出,Maven 2.2.1回覆了Sun的HTTP提供者實現(lightweight) 作為預設HTTP/HTTPS傳輸。這HttpClient-based提供者的問題主要涉及了檢查數,傳輸超時,和NTLM代理,飢和服務作為餓 而作為2.2.1發行版的首要因素。

無論如何,Maven 2.2.1開始你有一個選擇:你可以使用預設提供者的實現作為給予的協議,或者你選擇可替代的提供者來使用每一個基礎協議。為了獲得更多,請看提供者指南

Maven 3.0.4

在 3.0.4,預設的提供者http(s)是基於 Apache Http Client 4.1.2

。 現在http連線池對每一個請求避免了重開http(s)來遠端呼叫服務。連線池的特性是可配置一些引數。

新的預設提供者帶來了預設配置

  • http(s) 連線池:預設20
  • 讀超時:預設1800000ms(~30minutes)(看選項Read time out)
  • 預設先發制人的認證,之支援PUT(GET不能使用任何認證)

介紹

使用HttpClient-based HTTP提供者,你有更多控制在配置和使用HTTP-based 的Maven倉庫。 開始,你有好的授權控制,HTTP頭被使用當工件解決問題的時候。除此之外,你可以配置一個範圍引數來控制HttpClinett來控制它的行為。最好,你可以控制頭和引數對所有請求,或單獨的請求型別(Maven版本的GET,HEAD,和PUT請求是不同工件管理部分子系統)

基礎

沒有任何特別的配置,Maven 的HTTP提供者講使用一些預設的HTTP頭和客戶端引數當管理工件時。 預設頭:

Cache-control: no-cache
Cache-store: no-store
Pragma: no-cache
Expires: 0
Accept-Encoding: gzip

除此之外,PUT請求使用的HTTP提供者將使用以下引數:

http.protocol.expect-continue=true

來自HttpClient文件,蠶食提供以下特性:

Activates 'Expect: 100-Continue' handshake for the entity enclosing methods. 
The 'Expect: 100-Continue' handshake allows a client that is sending a request 
message with a request body to determine if the origin server is willing to 
accept the request (based on the request headers) before the client sends the 
request body.

The use of the 'Expect: 100-continue' handshake can result in noticeable performance 
improvement for entity enclosing requests (such as POST and PUT) that require 
the target server's authentication.

'Expect: 100-continue' handshake should be used with caution, as it may cause 
problems with HTTP servers and proxies that do not support HTTP/1.1 protocol.

沒有這些設定,PUT請求需要認證將轉移到他們整個有效負荷到服務端之前,服務端認證挑戰。為了完成PUT請求,客戶端必須重新負載使用指定的HTTP 頭資訊認證。這請求導致了使用頻寬的增加,和兩次傳遞每個工件的時間增加。

其他選項避免二次傳輸已經知道的認證,在涉及傳送認證頭中源於PUT請求。無論如何,這有少量潛在問題在方法中。為了一個,你沒有使用的==<server>節點指定一個無效使用者名稱/密碼,如果服務端沒有為請求富裕確切需要認證許可權,一些服務端甚至可能返回401未授權==。除此之外,盲目地傳送認證身份到任何請求而不管服務端是否制定了盤問,可能導致安全漏洞,自從服務端沒有制定規定來保護路徑的身份認證將不需要認證。

我們討論認證其他例子,如下。

配置GET,HEAD,PUT,或全部。

在下面的所有例子,理解怎麼對所有請求到服務端或者方法而配置HTTP,是很重要的。為了配置服務的所有方法,你可以使用下面的選項在settings.xml檔案:

<settings>
  [...]
  <servers>
    <server>
      <id>the-server</id>
      <configuration>
        <httpConfiguration>
          <all>
            [ Your configuration here. ]
          </all>
        </httpConfiguration>
      </configuration>
    </server>
  </servers>
</settings>

另一方面,如果你對大多數請求使用預設配置,例如HEAD和GET請求,你要去檢查是否存在一個檔案和檢索檔案-可能你只需要配置PUT方法:

<settings>
  [...]
  <servers>
    <server>
      <id>the-server</id>
      <configuration>
        <httpConfiguration>
          <put>
            [ Your configuration here. ]
          </put>
        </httpConfiguration>
      </configuration>
    </server>
  </servers>
</settings>

為了清晰,其他兩個選項==<get>是GET請求,<head>==是HEAD請求。我知道這是很難記的。。。

你的HTTP頭的控制

正如你有注意到,預設的HTTP頭有潛在的問題。作為一個例項,一些網站為了下GZipped檔案類似gzip=設定了轉碼,儘管這樣HTTP請求是不會發送 GZip壓縮的。如果客戶端使用Accept-Encoding: gzip==頭,就可以在客戶端解壓GZzipped檔案在傳輸和寫壓縮檔案到本地磁碟的時候。這可能是誤導性的說法,可以無節制地在你電腦中使用磁碟空間。

為了關閉預設行為,我們將簡單地禁用預設請求。然後,我們需要重新使用其他我們感興趣的頭資訊,例如:

<settings>
  [...]
  <servers>
    <server>
      <id>openssl</id>
      <configuration>
        <httpConfiguration>
          <put>
            <useDefaultHeaders>false</useDefaultHeaders>
            <headers>
              <header>
                <name>Cache-control</name>
                <value>no-cache</value>
              </header>
              <header>
                <name>Cache-store</name>
                <value>no-store</value>
              </header>
              <header>
                <name>Pragma</name>
                <value>no-cache</value>
              </header>
              <header>
                <name>Expires</name>
                <value>0</value>
              </header>
              <header>
                <name>Accept-Encoding</name>
                <value>*</value>
              </header>
            </headers>
          </put>
        </httpConfiguration>
      </configuration>
    </server>
    [...]
  </servers>
  [...]
</settings>

微調HttpClient引數

超越HTTP請求引數的能力,HttpClient提供了host配置選項。在很多例子中,你將不需要自定義。但是你可以做,Maven提供了接近指定你的自己Httpclient的細粒度配置。再次,你可以指定這些自定義引數到每個方法(HEAD,GET,和PUT ),甚至所有請求互相作用的服務端。為了完成列表所支援引數檢視下面連結[2]的資源選項。

非字元引數值

很多HttpClient配置引數有簡單的字元值;無論如何,這是重要的例外。在一些例子,你可能需要指定boolean,integer,或long values。在其他,你可能需要指定字串集合。你可以指定使用簡單格式的語法,像這樣:

  1. booleans: %b,<value>
  2. integer: %i,<value>
  3. long: %l,<value> (yes, that’s an ‘L’, not a ‘1’)
  4. double: %d,<value>
  5. collection of strings: %c,<value1>,<value2>,<value3>,…,如下:
%c,
<value1>,
<value2>,
<value3>,
...

當你注意到了,這語法類似於格式與資料策略使用的函式==sprintf()==在很多語言中。語法研究中與此相似,可以很直觀地去使用。

例子:使用先發制人的認證

使用上面的語法,我們可以為PUT請求配置先發制人的認證,使用boolean HttpClient引數http.authentication.preemptive,像:

<settings>
  <servers>
    <server>
      <id>my-server</id>
      <configuration>
        <httpConfiguration>
          <put>
            <params>
              <property>
                <name>http.authentication.preemptive</name>
                <value>%b,true</value>
              </property>
            </params>
          </put>
        </httpConfiguration>
      </configuration>
    </server>
  </servers>
</settings>

其他選項是這樣寫的:

<settings>
  <servers>
    <server>
      <id>my-server</id>
      <configuration>
        <httpConfiguration>
          <put>
            <usePreemptive>true</usePreemptive>
          </put>
        </httpConfiguration>
      </configuration>
    </server>
  </servers>
</settings>

忽略Cookies

像上面的指令,告訴HttpClient忽略每個方法請求的cookies,這是簡單的配置http.protocol.cookie-policy引數(使用規範的字串值,所以沒有特別語法的需要):

<settings>
  <servers>
    <server>
      <id>my-server</id>
      <configuration>
        <httpConfiguration>
          <all>
            <params>
              <param>
                <name>http.protocol.cookie-policy</name>
                <value>ignore</value>
              </param>
            </params>
          </all>
        </httpConfiguration>
      </configuration>
    </server>
  </servers>
</settings>

上面的配置很常用,在倉庫中使用cookies——像session cookies那樣經常誤開啟或者打不開連線——沿著HTTP重定向。在這些例子,會變成cookies釋出那樣使用Path,這是使用的一個客戶端訪問伺服器不一致。如果你有這個問題,要知道你不需要嗜慾session cookies,你可以從server中忽略cookies通過上面的配置。

支援通常提供者配置標準

這是很難記錄配置選項以前在HttpClient-driven HTTP 提供商是可用,依然支援額外的新的、細粒度的方法。這些配置包含HTTP頭和連線超時。讓我們檢查這些簡單:

HTTP 頭

在所有HTTP提供商的實現,你可以加入你自己的HTTP頭像這樣:

<settings>
  <servers>
    <server>
      <id>my-server</id>
      <configuration>
        <httpHeaders>
          <httpHeader>
            <name>Foo</name>
            <value>Bar</value>
          </httpHeader>
        </httpHeaders>
      </configuration>
    </server>
  </servers>
</settings>

理解上面方法很重要,不允許你關閉預設的HTTP頭資訊;也不允許你指定每一個方法的頭。無論如何,這配置意味著在輕量級和基礎HTTP提供者使用中是可用的。

連線超時

所有運載實現拓展的==AbstractWagon ==類,包含了SCP、HTTP、FTP還有更多可以配置連線超時的,為了讓使用者告訴Maven要等待多久唔響應而放棄連線。這選項儲存在基礎HttpClient,但是運載提供者是細粒度的、可替代的配置,你可以指定每個方法到伺服器的超時時間。老的配置選項-依然支援-像這樣。

<settings>
  <servers>
    <server>
      <id>my-server</id>
      <configuration>
        <timeout>6000</timeout> <!-- milliseconds -->
      </configuration>
    </server>
  </servers>
</settings>

新的配置選項像這樣:

<settings>
  <servers>
    <server>
      <id>my-server</id>
      <configuration>
        <httpConfiguration>
          <put>
            <connectionTimeout>10000</connectionTimeout> <!-- milliseconds -->
          </put>
        </httpConfiguration>
      </configuration>
    </server>
  </servers>
</settings>

如果你需要每一個服務超時配置,你依然可以使用老的==<timeout>==引數。如果你需要分離超時時間引用到HTTP方法,你可以使用指定上面你更喜歡的配置。

讀超時

Wagon 2.0和Apache Maven 3.0.4,預設超時是30min。如果你想改變這個值,你可以加入如下配置:

<settings>
  <servers>
    <server>
      <id>my-server</id>
      <configuration>
        <httpConfiguration>
          <put>
            <readTimeout>120000</readTimeout> <!-- milliseconds -->
          </put>
        </httpConfiguration>
      </configuration>
    </server>
  </servers>
</settings>

資源