使用 HttpClient 过程中常见的一些问题 下面介绍在使用 HttpClient 过程中常见的一些问题。 字符编码 某目标页的编码可能出现在两个地方,第一个地方是服务器返回的 http 头中,另外一个地方是得到的 html/xml 页面中。
在 http 头的 Content-Type 字段可能会包含字符编码信息。例如可能返回的头会包含这样子的信 息:Content-Type: text/html; charset=UTF-8。这个头信息表明该页的编码是 UTF-8,但是服务 器返回的头信息未必与内容能匹配上。比如对于一些双字节语言国家,可能服务器返回的编码类 型是 UTF-8, 但真正的内容却不是 UTF-8 编码的, 因此需要在另外的地方去得到页面的编码信息; 但是如果服务器返回的编码不是 UTF-8,而是具体的一些编码,比如 gb2312 等,那服务器返回 的可能是正确的编码信息。 通过 method 对象的 getResponseCharSet()方法就可以得到 http 头中 的编码信息。
对于象 xml 或者 html 这样的文件, 允许作者在页面中直接指定编码类型。 比如在 html 中会有
这样的标签;或者在
xml 中会 有这样的标签,在这些情况下,可能与 http 头中返回 的编码信息冲突,需要用户自己判断到底那种编码类型应该是真正的编码。
自动转向 根据 RFC2616 中对自动转向的定义, 主要有两种: 和 302。 表示永久的移走 301 301 (Moved Permanently) , 当返回的是 301,则表示请求的资源已经被移到一个固定的新地方,任何向该地址发起请求都会被转到新 的地址上。302 表示暂时的转向,比如在服务器端的 servlet 程序调用了 sendRedirect 方法,则在客户端 就会得到一个 302 的代码,这时服务器返回的头信息中 location 的值就是 sendRedirect 转向的目标地址。 HttpClient 支持自动转向处理,但是象 POST 和 PUT 方式这种要求接受后继服务的请求方式,暂时不支持 自动转向,因此如果碰到 POST 方式提交后返回的是 301 或者 302 的话需要自己处理。就像刚才在 POSTMethod 中举的例子:如果想进入登录 BBS 后的页面,必须重新发起登录的请求,请求的地址可以 在头字段 location 中得到。 不过需要注意的是, 有时候 location 返回的可能是相对路径, 因此需要对 location 返回的值做一些处理才可以发起向新地址的请求。 另外除了在头中包含的信息可能使页面发生重定向外,在页面中也有可能会发生页面的重定向。引起页面 自动转发的标签是:
。如果你想在程 序中也处理这种情况的话得自己分析页面来实现转向。 需要注意的是, 在上面那个标签中 url 的值也可以是
一个相对地址,如果是这样的话,需要对它做一些处理后才可以转发。 处理 HTTPS 协议 HttpClient 提供了对 SSL 的支持, 在使用 SSL 之前必须安装 JSSE。 Sun 提供的 1.4 以后的版本中, 在 JSSE 已经集成到 JDK 中,如果你使用的是 JDK1.4 以前的版本则必须安装 JSSE。JSSE 不同的厂家有不同的 实现。下面介绍怎么使用 HttpClient 来打开 Https 连接。这里有两种方法可以打开 https 连接,第一种就是 得到服务器颁发的证书,然后导入到本地的 keystore 中;另外一种办法就是通过扩展 HttpClient 的类来实 现自动接受证书。 方法 1,取得证书,并导入本地的 keystore:
安装 JSSE (如果你使用的 JDK 版本是 1.4 或者 1.4 以上就可以跳过这一步)。本文以 IBM 的 JSSE 为例子说明。先到 IBM 网站上下载 JSSE 的安装包。然后解压开之后将 ibmjsse.jar 包拷贝 到
\lib\ext\目录下。
取得并且导入证书。证书可以通过 IE 来获得:
1. 用 IE 打开需要连接的 https 网址,会弹出如下对话框:
2. 单击"View Certificate",在弹出的对话框中选择"Details",然后再单击"Copy to File",根据提 供的向导生