1.使用HttpClient 需要以下 6 个步骤:
创建 HttpClient 的实例
创建某种连接方法的实例,在这里是GetMethod。在 GetMethod 的构造函数中传入待连接的地址
调用第一步中创建好的实例的 execute 方法来执行第二步中创建好的 method 实例
读 response
释放连接。无论执行方法是否成功,都必须释放连接
对得到后的内容进行处理
2.使用Get方式提交请求
2.1 创建HttpClient实例。大部分情况下 HttpClient 默认的构造函数已经足够使用。
HttpClient httpClient = new HttpClient();
2.2 创建GET方法的实例。在GET方法的构造函数中传入待连接的地址即可。
2.3
调用实例httpClient的executeMethod方法来执行getMethod。
由于是执行在网络上的程序,在运行executeMethod方法的时候,需要处理两个异常,分别是HttpException和IOException。引起第一种异常的原因主要可能是在构造getMethod的时候传入的协议不对,比如不小心将"http"写成"htp",或者服务器端返回的内容不正常等,并且该异常发生是不可恢复的;第二种异常一般是由于网络原因引起的异常,对于这种异常 (IOException),HttpClient会根据你指定的恢复策略自动试着重新执行executeMethod方法。HttpClient的恢复策略可以自定义(通过实现接口HttpMethodRetryHandler来实现)。通过httpClient的方法setParameter设置你实现的恢复策略。executeMethod返回值是一个整数,表示了执行该方法后服务器返回的状态码,该状态码能表示出该方法执行是否成功、需要认证或者页面发生了跳转(默认状态下
GetMethod的实例是自动处理跳转的)等。
//设置成了默认的恢复策略,在发生异常时候将自动重试3次,在这里你也可以设置成自定义的恢复策略
getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
//执行getMethod
int statusCode = client.executeMethod(getMethod);
if (statusCode != HttpStatus.SC_OK) {
System.err.println("Method failed: " + getMethod.getStatusLine());
}
在返回的状态码正确后,即可取得内容。取得目标地址的内容有三种方法:第一种,getResponseBody(),该方法返回的是目标的二进
制的byte流;第二种,getResponseBodyAsString(),这个方法返回的是String类型;第三种,getResponseBodyAsStream()
,这个方法对于目标地址中有大量数据需要传输是最佳的。在这里我们使用了最简单的getResponseBody方法。
byte[] responseBody = method.getResponseBody();
2.5
释放连接。无论执行方法是否成功,都必须释放连接。
method.releaseConnection();
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的参数。
httpClient.getParams().setHttpElementCharset("UTF-8");
4.1.2
有时候,服务器返回的页面内容出现中文乱码,可以设置如下参数:
httpClient.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,"UTF-8");
4.2超时的设置
4.2.1连接超时设置
httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
4.2.2读取信息超时设置
httpClient.getHttpConnectionManager().getParams().setSoTimeout(1000);
4.3 自定义恢复策略 正如前文所说,当出现IOException异常时,httpclient可以根据我们指定的恢复策略自动试着重新执行
executeMethod方法。如果我们不想让httpclient重新执行executeMethod(),或是不想让它重新执行3次,可以如下设置:
//不重试
getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,new DefaultHttpMethodRetryHandler(0,false));
//重试1次
getMethod.getParams().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 = method.getResponseHeader("location").getValue();
一些常见的http状态码及含义:
200 获取到页面 HttpStatus.SC_OK
301 永久移动. HttpStatus.SC_MOVED_PERMANENTLY
302 临时移动. HttpStatus.SC_MOVED_TEMPORARILY
303 See Other. HttpStatus.SC_SEE_OTHER
307 临时重定向. HttpStatus.SC_TEMPORARY_REDIRECT
4.5 设置代理
有些网站要浏览器才可以访问,但程序可以仿浏览器,主要是设置http头。
//设置代理服务器的ip地址和端口
httpClient.getHostConfiguration().setProxy(ip,port);
//设置http头
List headers = new ArrayList();
headers.add(new Header("User-Agent",Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"));
httpClient.getHostConfiguration().getParams().setParameter("http.default-headers", headers);