原文链接 译者: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版本和可用性
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。在其他,你可能需要指定字符串集合。你可以指定使用简单格式的语法,像这样:
- booleans: %b,<value>
- integer: %i,<value>
- long: %l,<value> (yes, that’s an ‘L’, not a ‘1’)
- double: %d,<value>
- 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>
资源
原创文章,作者:kepupublish,如若转载,请注明出处:https://blog.ytso.com/99757.html