`
jeafyezheng
  • 浏览: 99624 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

httpclient学习笔记

阅读更多

apache/commons/httpclient学习笔记()<o:p></o:p>

<!----><!---->httpclient_logo.png<!---->  虽然用telnet这样的程序都可把页面取回来,但是在与web服务器的交互中,如果涉及cookiehttpsssl等内容,一般功能相对完备的http客户端还是非常必要的。IENetScape等浏览器确实不错,可是如果为实现持续互动而在程序调用浏览器,我个人认为其中的工作量还是不小的,这还没考虑版权问题。最好的办法,就是能有一个开源的包,能实现http客户端的功能,供我们开发的程序调用。httpclient就是这么一个包,我相信可能有比它的实现更好的,但目前我只关注这个。:)<o:p></o:p>

  下面是nogoop做的功能比较表:<o:p></o:p>

Features<o:p></o:p>

nogoop<o:p></o:p>

Sun JRE < <st1:chsdate month="12" islunardate="False" day="30" year="1899" w:st="on" isrocdate="False">1.4.2</st1:chsdate><o:p></o:p>

Sun JRE <st1:chsdate month="12" islunardate="False" day="30" year="1899" w:st="on" isrocdate="False">1.4.2</st1:chsdate><o:p></o:p>

Innovation<o:p></o:p>

Apache/Jakarta<o:p></o:p>

cookies<o:p></o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

X<o:p></o:p>

X<o:p></o:p>

plug compatible<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

[partial]<o:p></o:p>

true request output stream<o:p></o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

X<o:p></o:p>

X<o:p></o:p>

true response input stream<o:p></o:p>

X<o:p></o:p>

<o:p> </o:p>

<o:p> </o:p>

X<o:p></o:p>

X<o:p></o:p>

connection keep alive<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

connection pool throttling<o:p></o:p>

X<o:p></o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

X<o:p></o:p>

connection/request timeout<o:p></o:p>

X<o:p></o:p>

<o:p> </o:p>

X [uns]<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

idle connection timeout<o:p></o:p>

X<o:p></o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

X<o:p></o:p>

pipelining of requests<o:p></o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

X<o:p></o:p>

<o:p> </o:p>

alternate DNS resolution (dnsjava)<o:p></o:p>

X<o:p></o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

<o:p> </o:p>

SSL<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

basic authentication<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

digest authentication<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

NTLM authentication<o:p></o:p>

X<o:p></o:p>

<o:p> </o:p>

[Windows only]<o:p></o:p>

<o:p> </o:p>

X<o:p></o:p>

proxy authentication<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

minimum JRE version<o:p></o:p>

1.2<o:p></o:p>

1<o:p></o:p>

<st1:chsdate month="4" islunardate="False" day="2" year="2001" w:st="on" isrocdate="False">0142</st1:chsdate><o:p></o:p>

1.2<o:p></o:p>

1.2<o:p></o:p>

price<o:p></o:p>

$499<o:p></o:p>

free<o:p></o:p>

free<o:p></o:p>

free<o:p></o:p>

free<o:p></o:p>

source available<o:p></o:p>

X<o:p></o:p>

<o:p> </o:p>

<o:p> </o:p>

X<o:p></o:p>

X<o:p></o:p>

diagnostic tracing<o:p></o:p>

X<o:p></o:p>

<o:p> </o:p>

<o:p> </o:p>

X<o:p></o:p>

X<o:p></o:p>

actively supported<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

X<o:p></o:p>

<o:p> </o:p>

X<o:p></o:p>

fix turnaround<o:p></o:p>

fast<o:p></o:p>

slow<o:p></o:p>

slow<o:p></o:p>

none<o:p></o:p>

medium<o:p></o:p>

license<o:p></o:p>

purchase<o:p></o:p>

Sun JRE<o:p></o:p>

Sun JRE<o:p></o:p>

LGPL<o:p></o:p>

Apache<o:p></o:p>

<o:p> </o:p>

1HttpClient的功能<o:p></o:p>

<o:p> </o:p>

<o:p> </o:p>

  1. 基于标准,纯正java,实现了http1.01.1<o:p></o:p>
  2. 在一个可扩展的OO框架内,实现了HTTP的全部方法(GET, POST,
    PUT, DELETE, HEAD, OPTIONS, and TRACE)<o:p></o:p>
  3. 支持HTTPS(ssl上的HTTP)的加密操作<o:p></o:p>
  4. 透明地穿过HTTP代理建立连接<o:p></o:p>
  5. 通过CONNECT方法,利用通过建立穿过HTTP代理的HTTPS连接<o:p></o:p>
  6. 利用本地Java socket,透明地穿过SOCKS(版本54)代理建立连接<o:p></o:p>
  7. 支持利用BasicDigestNTLM加密的认证<o:p></o:p>
  8. 支持用于上传大文件的Multi-Part表单POST方法<o:p></o:p>
  9. 插件式安全socket实现,易于使用第三方的解决方案<o:p></o:p>
  10. 连接管理,支持多线程应用,支持设定单个主机总连接和最高连接数量,自动检测和关闭失效连接<o:p></o:p>
  11. 直接将请求信息流送到服务器的端口<o:p></o:p>
  12. 直接读取从服务器的端口送出的应答信息<o:p></o:p>
  13. 支持HTTP/1.0中用KeepAliveHTTP/1.1中用persistance设置的持久连接<o:p></o:p>
  14. 直接访问由服务器送出的应答代码和头部信息<o:p></o:p>
  15. 可设置连接超时时间 <o:p></o:p>
  16. <o:p> </o:p>
  17. HttpMethods 实现Command Pattern,以允许并行请求或高效连接复用<o:p></o:p>
  18. 遵循the Apache Software License协议,源码免费可得 <o:p></o:p>

<o:p> </o:p>

2、预备工作<o:p></o:p>


  对jre1.3.*,如果要HttpClient支持https,则需要下载并安装
jssejce.安装的步骤如下:
1)
下载jssejce.
2)
检查CLASSPATH中没有与jssejce相关的jar
3)
US_export_policy.jarlocal_policy.jarjsse.jarjnet.jarjce1_2_x.jarsunjce_provider.jarjcert.jar复制到目录:
UNIX:$JDK_HOME/jre/lib/ext
Windows:%JDK_HOME%\jre\lib\ext
4)
修改下述目录下的java.security文件。
UNIX:$JDK_HOME/jre/lib/security/
Windows:%JDK_HOME%\jre\lib\security\
5) <o:p></o:p>


#
# List of providers and their preference orders:
#
security.provider.1=sun.security.provider.Sun
security.provider.2=com.sun.rsajca.Provider
改为:
#
# List of providers and their preference orders:
#
security.provider.1=com.sun.crypto.provider.SunJCE
security.provider.2=sun.security.provider.Sun
security.provider.3=com.sun.rsajca.Provider
security.provider.4=com.sun.net.ssl.internal.ssl.Provider<o:p></o:p>


  HttpClient还要求安装commons-logging,下面跟httpclient一块安装。<o:p></o:p>

3、取得源码<o:p></o:p>

<o:p> </o:p>

cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic login
password: anoncvs
cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic checkout jakarta-commons/logging
cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic checkout jakarta-commons/httpclient<o:p></o:p>


  编译: <o:p></o:p>

cd jakarta-commons/logging
ant dist
cp dis/*.jar ../httpclient/lib/
cd ../httpclient
ant dist<o:p></o:p>

<o:p> </o:p>

4、使用HttpClient编程的基本步聚<o:p></o:p>

<o:p> </o:p>

  1. 创建 HttpClient 的一个实例.<o:p></o:p>
  2. 创建某个方法(DeleteMethodEntityEnclosingMethodExpectContinueMethodGetMethodHeadMethodMultipartPostMethodOptionsMethodPostMethodPutMethodTraceMethod)的一个实例,一般可用要目标URL为参数。<o:p></o:p>
  3. HttpClient 执行这个方法.<o:p></o:p>
  4. 读取应答信息.<o:p></o:p>
  5. 释放连接.<o:p></o:p>
  6. 处理应答.<o:p></o:p>


  在执行方法的过程中,有两种异常,一种是HttpRecoverableException,表示偶然性错误发生,一般再试可能成功,另一种是IOException,严重错误。
  这儿有这个教程中的一个例程,可以下载 <o:p></o:p>

参考资料:
http://www.systinet.com/doc/wasp_uddi/uddi/igpreliminary.html<o:p></o:p>

HttpClient学习()<o:p></o:p>

  下面学习与http客户端相关的认证、重定向等内容。<o:p></o:p>

1、认证<o:p></o:p>


  HttpClient三种不同的认证方案: Basic, Digest and NTLM. 这些方案可用于服务器或代理对客户端的认证,简称服务器认证或代理认证。
1)
服务器认证(Server Authentication)
  HttpClient处理服务器认证几乎是透明的,仅需要开发人员提供登录信息(login credentials)。登录信息保存在HttpState类的实例中,可以通过 setCredentials(String realm, Credentials cred)getCredentials(String realm)来获取或设置。注意,设定对非特定站点访问所需要的登录信息,将realm参数置为null. HttpClient内建的自动认证,可以通过HttpMethod类的setDoAuthentication(boolean doAuthentication)方法关闭,而且这次关闭只影响HttpMethod当前的实例。
  抢先认证(Preemptive Authentication)可以通过下述方法打开. <o:p></o:p>

client.getState().setAuthenticationPreemptive(true);<o:p></o:p>

在这种模式时,HttpClient会主动将basic认证应答信息传给服务器,即使在某种情况下服务器可能返回认证失败的应答,这样做主要是为了减少连接的建立。为使每个新建的 HttpState实例都实行抢先认证,可以如下设置系统属性。 <o:p></o:p>

setSystemProperty(Authenticator.PREEMPTIVE_PROPERTY, "true");<o:p></o:p>


Httpclient
实现的抢先认证遵循rfc2617.
2)
代理认证(proxy authentication)
  除了登录信息需单独存放以外,代理认证与服务器认证几乎一致。用 setProxyCredentials(String realm, Credentials cred) getProxyCredentials(String realm)设、取登录信息。
3)
认证方案(authentication schemes)
  Basic
  是HTTP中规定最早的也是最兼容(?)的方案,遗憾的是也是最不安全的一个方案,因为它以明码传送用户名和密码。它要求一个UsernamePasswordCredentials实例,可以指定服务器端的访问空间或采用默认的登录信息。
  Digest
  是在HTTP1.1中增加的一个方案,虽然不如Basic得到的软件支持多,但还是有广泛的使用。Digest方案比Basic方案安全得多,因它根本就不通过网络传送实际的密码,传送的是利用这个密码对从服务器传来的一个随机数(nonce)的加密串。它要求一个UsernamePasswordCredentials实例,可以指定服务器端的访问空间或采用默认的登录信息。
  NTLM
  这是HttpClient支持的最复杂的认证协议。它M$设计的一个私有协议,没有公开的规范说明。一开始由于设计的缺陷,NTLM的安全性比Digest差,后来经过一个ServicePack补丁后,安全性则比较Digest高。NTLM需要一个NTCredentials实例. 注意,由于NTLM不使用访问空间(realms)的概念,HttpClient利用服务器的域名作访问空间的名字。还需要注意,提供给NTCredentials的用户名,不要用域名的前缀 - : "adrian" 是正确的,而 "DOMAIN\adrian" 则是错的.
  NTLM认证的工作机制与basicdigest有很大的差别。这些差别一般由HttpClient处理,但理解这些差别有助避免在使用NTLM认证时出现错误。<o:p></o:p>

  1. HttpClientAPI的角度来看,NTLM与其它认证方式一样的工作,差别是需要提供'NTCredentials'实例而不是'UsernamePasswordCredentials'(其实,前者只是扩展了后者)<o:p></o:p>
  2. NTLM认证,访问空间是连接到的机器的域名,这对多域名主机会有一些麻烦.只有HttpClient连接中指定的域名才是认证用的域名。建议将realm设为null以使用默认的设置。<o:p></o:p>
  3. NTLM只是认证了一个连接而不是一请求,所以每当一个新的连接建立就要进行一次认证,且在认证的过程中保持连接是非常重要的。 因此,NTLM不能同时用于代理认证和服务器认证,也不能用于http1.0连接或服务器不支持持久连接的情况。<o:p></o:p>

2、重定向<o:p></o:p>


  由于技术限制,以及为保证2.0发布版API的稳定,HttpClient还不能自动处重定向,但对重定向到同一主机、同一端口且采用同一协议的情况HttpClient可以支持。不能自动的处理的情况,包括需要人工交互的情况,或超出httpclient的能力。
  当服务器重定向指令指到不同的主机时,HttpClient只是简单地将重定向状态码作为应答状态。所有的300399(包含两端)的返回码,都表示是重定向应答。常见的有:<o:p></o:p>

  1. 301 永久移动. HttpStatus.SC_MOVED_PERMANENTLY<o:p></o:p>
  2. 302 临时移动. HttpStatus.SC_MOVED_TEMPORARILY<o:p></o:p>
  3. 303 See Other. HttpStatus.SC_SEE_OTHER<o:p></o:p>
  4. 307 临时重定向. HttpStatus.SC_TEMPORARY_REDIRECT<o:p></o:p>


  当收到简单的重定向时,程序应从HttpMethod对象中抽取新的URL并将其下载。另外,限制一下重定向次数是个好的主意,这可以避免递归循环。新的URL可以从头字段Location中抽取,如下: <o:p></o:p>

String redirectLocation;
Header locationHeader = method.getResponseHeader("location");
if (locationHeader != null) {
redirectLocation = locationHeader.getValue();
} else {
// The response is invalid and did not provide the new location for
// the resource. Report an error or possibly handle the response
// like a 404 Not Found error.
}<o:p></o:p>


特殊重定向:<o:p></o:p>

  1. 300 多重选择. HttpStatus.SC_MULTIPLE_CHOICES<o:p></o:p>
  2. 304 没有改动. HttpStatus.SC_NO T_MODIFIED<o:p></o:p>
  3. 305 使用代理. HttpStatus.SC_USE_PROXY <o:p></o:p>

HttpClient学习()<o:p></o:p>

  连续三天外出听讲座,httpclient的学习耽误了。今天学习字符编码、cookie处理部分以及如何排错。<o:p></o:p>

   <o:p></o:p>

1、字符编码(character encoding)<o:p></o:p>


  一个HTTP协议的请求或应答的头部(http协议中,数据包分为两部分,一部分是头部,由一些名值对构成,一部分是主体(body),是真正传办理的数据(如HTML页面等)),必须以US-ASCII编码,这是因为头部不传数据而只描述被要传输的数据的一些信息,一个例外是cookie,它是数据但是通过头部进行传输的,所以它也要用US-ASCII编码。
  HTTP数据包的主体部分,可以用任何一种方式进行编码,默认是ISO-8859-1,具体可以用头部字段Content-Type指定。可以利用 addRequestHeader方法,设定编码方式;用 getResponseCharSet取得编码方式。对HTMLXML等类型的文档,它们的本身的Content-Type也可以指定编码方式,主要区分两者的作用范围以得到正确实的解码。
  URL的编码标准,由RFC1738指定为,只能是由可打印8/字节的us-ascii字符组成,80-ff不是us-ascii字符,而00<st1:chmetcnv hasspace="False" numbertype="1" negative="True" sourcevalue="1" w:st="on" unitname="F" tcsc="0">-1F</st1:chmetcnv>是控制字符,这两个区域中用的字符都须加以编码(encoded)
   <o:p></o:p>

2Cookies<o:p></o:p>


   HttpClient能自动管理cookie,包括允许服务器设置cookie并在需要的时候自动将cookie返回服务器,它也支持手工设置cookie后发送到服务器端。不幸的是,对如何处理cookie,有几个规范互相冲突:Netscape Cookie 草案, RFC2109, RFC2965,而且还有很大数量的软件商

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics