一、 HttpClient 功能简介
●实现了所有 HTTP 的方法(GET,POST,PUT,HEAD,OPTIONS,TRACE)
●支持自动转向
●支持 HTTPS 协议
●透明地穿过HTTP代理建立连接
●通过CONNECT方法,利用通过建立穿过HTTP代理的HTTPS连接
●利用本地Java socket,透明地穿过SOCKS(版本5和4)代理建立连接
●支持利用Basic、Digest和NTLM加密的认证
●支持用于上传大文件的Multi-Part表单POST方法
●插件式安全socket实现,易于使用第三方的解决方案
●连接管理,支持多线程应用,支持设定单个主机总连接和最高连接数量,自动检测和关闭失效的连接
●直接将请求信息流送到服务器的端口
●直接读取从服务器的端口送出的应答信息
●支持HTTP/1.0中用KeepAlive和HTTP/1.1中用persistance设置的持久连接
●直接访问由服务器送出的应答代码和头部信息
●可设置连接超时时间
●HttpMethods 实现Command Pattern,以允许并行请求或高效连接复用
●遵循the Apache Software License协议,源码免费可得
二、 环境搭建
1. HttpClient 3.1 所需的基本jar包:
commons-httpclient-3.1.jar,下载地址:
/dist/httpcomponents/commons-httpclient/binary/;
commons-logging.jar,下载地址:
/logging/i;
commons-codec.jar,下载地址:
/codec/i;
2. HttpClient 4所需的基本jar包:
下载地址:/i;
最新版本为4.1.2,且官方不再升级HttpClient3。
三、 HttpClient 3.x 基本功能的使用
1. 使用 HttpClient 需要以下 6 个步骤:
●创建 HttpClient 的实例
●创建某种连接方法的实例,在这里是 GetMethod。在 GetMethod 的构造函数中传入待连接的地址
●调用第一步中创建好的实例的 execute 方法来执行第二步中创建好的 method 实例
●读 response
●释放连接。无论执行方法是否成功,都必须释放连接
●对得到后的内容进行处理
2. 使用Get方式提交请求
2.1创建HttpClient实例。大部分情况下 HttpClient 默认的构造函数已经足够使用。
HttpClient httpClient = new HttpClient(); 2.2创建GET方法的实例。在GET方法的构造函数中传入待连接的地址即可。 |
GetMethod getMethod = new GetMethod("www.baidu/");
2.3调用实例httpClient的executeMethod方法来执行getMethod。由于是执行在网络上的程序,在运行executeMethod方法的时候,需要处理两个异常,分别是HttpException和IOException。引起第一种异常的原因主要可能是在构造getMethod的时候传入的协议不对,比如不小心将"http"写成"htp",或者服务器端返回的内容不正常等,并且该异常发生是不可恢复的;第二种异常一般是由于网络原因引起的异常,对于这种异常 (IOException),HttpClient会根据你指定的恢复策略自动试着重新执行executeMethod方法。HttpClient的恢复策略可以自定义(通过实现接口HttpMethodRetryHandler来实现)。通过httpClient的方法setParameter设置你实现的恢复策略。executeMethod返回值是一个整数,表示了执行该方法后服务器返回的状态码,该状态码能表示出该方法执行是否成功、需要认证或者页面发生了跳转(默认状态下GetMethod的实例是自动处理跳转的)等。
//设置成了默认的恢复策略,在发生异常时候将自动重试3次,在这里你也可以设置成自定义的恢复策略
Params().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler());
//执行getMethod
int statusCode = uteMethod(getMethod);
if (statusCode != HttpStatus.SC_OK) {
println("Method failed: " + StatusLine());
}
2.4在返回的状态码正确后,即可取得内容。取得目标地址的内容有三种方法:第一种,getResponseBody(),该方法返回的是目标的二进制的byte流;第二种,getResponseBodyAsString(),这个方法返回的是String类型;第三种,getResponseBodyAsStream(),这个方法对于目标地址中有大量数据需要传输是最佳的。在这里我们使用了最简单的getResponseBody方法。
byte[] responseBody = ResponseBody();
2.5释放连接。无论执行方法是否成功,都必须释放连接。
leaseConnection();
2.6处理内容。
System.out.println(new String(responseBody));
3. 使用Post方式提交请求
3.1使用post的方式提交请求,步骤与get方式类似,只是声明方法实例的时候,使用的是PostMethod。
PostMethod postMethod = new PostMethod (url);
3.2传递参数
当我们需要使用post方式提交表单时,可以使用类NameValuePair表示表单中的域;该类
的构造函数第一个参数是域名,第二参数是该域的值;将表单所有的值设置到PostMethod中用方法setRequestBody。例如:
NameValuePair nameValuePair = new NameValuePair("mob","1330227");
//将参数放入post方法中去
post.setRequestBody(new NameValuePair[] { nameValuePair} );
如果传递多个参数,可以使用逗号隔开,即可。
4. 使用HttpClient3遇到的一些问题及解决方法
4.1字符编码问题。
4.1.1有时候,当我们传递的参数中含有中文的时候,使用httpclient发送,web服务器无法识别,如果返回的http响应头中含有中文字符,也会出现乱码。解决的方法是修改httpclient的参数。
Params().setHttpElementCharset("UTF-8");
4.1.2有时候,服务器返回的页面内容出现中文乱码,可以设置如下参数:
Params().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF-8");
4.2超时的设置
4.2.1连接超时设置
HttpConnectionManager().getParams().setConnectionTimeout(5000);
4.2.2读取信息超时设置
HttpConnectionManager().getParams().setSoTimeout(1000);
4.3 自定义恢复策略
正如前文所说,当出现IOException异常时,httpclient可以根据我们指定的恢复策略自动试着重新执行executeMethod方法。如果我们不想让httpclient重新执行executeMethod(),或是不想让它重新执行3次,可以如下设置:
//不重试
Params().setParameter(HttpMethodParams.RETRY_HANDLER,new DefaultHttpMethodRetryHandler(0,false));
//重试1次
Params().setParameter(HttpMethodParams.RETRY_HANDLER,
new DefaultHttpMethodRetryHandler(1,true));
我们也可以自定义恢复策略,通过实现HttpRequestRetryHandler接口,执行自定义的行为。
4.4 重定向问题
Httpclient的get的方法支持自动转向处理,而post方法不支持。当然我们也可以取消掉httpclient的自动转向处理,可以调用方法:
getMethod.setFollowRedirects(false)。
我们可以根据执行过http方法后,根据得到的返回状态进行自定义处理。如果得到301代码,这时服务器返回的头信息中location的值就是sendRedirect转向的目标地址。可以通过以下方法读取新的url:
String newurl = ResponseHeader("location").getValue();
一些常见的http状态码及含义:
200 获取到页面 HttpStatus.SC_OK
301 永久移动. HttpStatus.SC_MOVED_PERMANENTLY
下载apache302 临时移动. HttpStatus.SC_MOVED_TEMPORARILY
303 See Other. HttpStatus.SC_SEE_OTHER
307 临时重定向. HttpStatus.SC_TEMPORARY_REDIRECT
4.5 设置代理
有些网站要浏览器才可以访问,但程序可以仿浏览器,主要是设置http头。
//设置代理服务器的ip地址和端口
HostConfiguration().setProxy(ip,port);
//设置http头
List headers = new ArrayList();
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论