HttpClient

来源:互联网 发布:淘宝模块配色代码 编辑:程序博客网 时间:2024/06/18 11:02

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("http://www.baidu.com/"); 

2.3

调用实例httpClientexecuteMethod方法来执行getMethod

由于是执行在网络上的程序,在运行executeMethod方法的时候,需要处理两个异常,分别是HttpExceptionIOException。引起第一种异常的原因主要可能是在构造getMethod的时候传入的协议不对,比如不小心将"http"写成"htp",或者服务器端返回的内容不正常等,并且该异常发可恢的;二种常一是由络原引起异常对于种异 IOExceptionHttpClient会根据你指定的恢复策略自动试着重新执行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()); 

 2.4

 在返回的状态码正确后,即可取得内容。取得目标地址的内容有三种方法:第一种,getResponseBody()

bytegetResponseBodyAsString()StringgetResponseBodyAsStream()

,这个方法对于目标地址中有大量数据需要传输是最佳的。在这里我们使用了最简单的getResponseBody方法。 

byte[] responseBody = method.getResponseBody(); 

String response = new String(getmethod.getResponseBodyAsString().getBytes("UTF-8"));

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可以根据我们指定的恢复策略自

executeMethodhttpclientexecuteMethod(),或是不想让它重新执行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 重定向问题 

Httpclientget的方法支持自动转向处理,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); 



0 0