2023年8月3日发(作者:)

一、 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包:

,下载地址:

/dist/httpcomponents/commons-httpclient/binary/;

,下载地址:

/logging/download_;

,下载地址:

/codec/download_;

2. HttpClient 4所需的基本jar包:

下载地址:/;

最新版本为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("/");

2.3 调用实例httpClient的executeMethod方法来执行getMethod。由于是执行在网络上的程序,在运行executeMethod方法的时候,需要处理两个异常,分别是HttpException和IOException。引起第一种异常的原因主要可能是在构造getMethod的时候传入的协议不对,比如不小心将"http"写成"htp",或者服务器端返回的内容不正常等,并且该异常发生是不可恢复的;第二种异常一般是由于网络原因引起的异常,对于这种异常

(IOException),HttpClient会根据你指定的恢复策略自动试着重新执行executeMethod方法。HttpClient的恢复策略可以自定义(通过实现接口HttpMethodRetryHandler来实现)。通过httpClient的方法setParameter设置你实现的恢复策略。executeMethod返回值是一个整数,表示了执行该方法后服务器返回的状态码,该状态码能表示出该方法执行是否成功、需要认证或者页面发生了跳转(默认状态下GetMethod的实例是自动处理跳转的)等。

//设置成了默认的恢复策略,在发生异常时候将自动重试3次,在这里你也可以设置成自定义的恢复策略

ams().setParameter(_HANDLER,

new DefaultHttpMethodRetryHandler());

//执行getMethod

int statusCode = eMethod(getMethod);

if (statusCode != _OK) {

n("Method failed: " + tusLine());

}

2.4 在返回的状态码正确后,即可取得内容。取得目标地址的内容有三种方法:第一种,getResponseBody(),该方法返回的是目标的二进制的byte流;第二种,getResponseBodyAsString(),这个方法返回的是String类型;第三种,getResponseBodyAsStream(),这个方法对于目标地址中有大量数据需要传输是最佳的。在这里我们使用了最简单的getResponseBody方法。

byte[] responseBody = ponseBody();

2.5 释放连接。无论执行方法是否成功,都必须释放连接。

eConnection();

2.6 处理内容。

n(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方法中去

uestBody(new NameValuePair[] { nameValuePair} );

如果传递多个参数,可以使用逗号隔开,即可。

4. 使用HttpClient3遇到的一些问题及解决方法 4.1 字符编码问题。

4.1.1有时候,当我们传递的参数中含有中文的时候,使用httpclient发送,web服务器无法识别,如果返回的http响应头中含有中文字符,也会出现乱码。解决的方法是修改httpclient的参数。

ams().setHttpElementCharset("UTF-8");

4.1.2 有时候,服务器返回的页面内容出现中文乱码,可以设置如下参数:

ams().setParameter(_CONTENT_CHARSET,

"UTF-8");

4.2超时的设置

4.2.1连接超时设置

pConnectionManager().getParams().setConnectionTimeout(5000);

4.2.2读取信息超时设置

pConnectionManager().getParams().setSoTimeout(1000);

4.3 自定义恢复策略

正如前文所说,当出现IOException异常时,httpclient可以根据我们指定的恢复策略自动试着重新执行executeMethod方法。如果我们不想让httpclient重新执行executeMethod(),或是不想让它重新执行3次,可以如下设置:

//不重试

ams().setParameter(_HANDLER,new

DefaultHttpMethodRetryHandler(0,false));

//重试1次

ams().setParameter(_HANDLER,

new DefaultHttpMethodRetryHandler(1,true));

我们也可以自定义恢复策略,通过实现HttpRequestRetryHandler接口,执行自定义的行为。

4.4 重定向问题

Httpclient的get的方法支持自动转向处理,而post方法不支持。当然我们也可以取消掉httpclient的自动转向处理,可以调用方法:

lowRedirects(false)。

我们可以根据执行过http方法后,根据得到的返回状态进行自定义处理。如果得到301代码,这时服务器返回的头信息中location的值就是sendRedirect转向的目标地址。可以通过以下方法读取新的url:

String newurl = ponseHeader("location").getValue();

一些常见的http状态码及含义:

200 获取到页面 _OK

301 永久移动. _MOVED_PERMANENTLY

302 临时移动. _MOVED_TEMPORARILY

303 See Other. _SEE_OTHER

307 临时重定向. _TEMPORARY_REDIRECT

4.5 设置代理

有些网站要浏览器才可以访问,但程序可以仿浏览器,主要是设置http头。

//设置代理服务器的ip地址和端口

tConfiguration().setProxy(ip,port);

//设置http头

List headers = new ArrayList(); (new Header("User-Agent",Mozilla/4.0 (compatible; MSIE 7.0; Windows NT

5.1)"));

tConfiguration().getParams().setParameter("t-headers",

headers);

四、 HttpClient 4.x基本功能的使用

1.

使用Get方式提交请求

1.1创建httpclient实例

HttpClient httpclient = new DefaultHttpClient();

1.2构建get方法实例

HttpGet httpget = new HttpGet("/");

1.3 执行方法,获得响应

HttpResponse response = e(httpget);

HttpEntity entity = ity();

1.4处理得到的http实体

n(ng(entity));//以String形式获取内容

EntityUtils. toByteArray(entity)//以二进制byte流形式

tent()//流的形式

1.5 释放连接资源(必须执行的)

nectionManager().shutdown();

2. 使用Post方式提交请求(参考HttpClient 教程 (一).htm)

2.1除了构建方法使用的是:

HttpPost httppost = new HttpPost("/");

其他的步骤与使用get方式相同。

2.2 传递参数

许多应用程序需要频繁模拟提交一个HTML表单的过程,比如,为了来记录一个Web应用程序或提交输出数据。HttpClient提供了特殊的实体类UrlEncodedFormEntity来这个满足过程。

List formparams = new ArrayList();

(new BasicNameValuePair("param1", "value1"));

(new BasicNameValuePair("param2", "value2"));

UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, "UTF-8");

HttpPost httppost = new HttpPost("localhost/");

ity(entity);

3. 使用HttpClient4遇到的一些问题及解决方法

3.1 字符编码

3.1.1参数中文乱码解决:

Get方式提交的乱码处理:

 对中文参数使用(src);来编码;

 设置GetMethod编码格式为utf-8:get_uestHeader("Content-type" ,

"text/html; charset=utf-8");

Post方式提交的乱码处理:

UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, "UTF-8");

3.1.2 内容中文乱码处理:

ng(entity,"utf-8"); 3.2超时设置

ams().setIntParameter(TION_TIMEOUT,5000);//连接超时

ams().setIntParameter(_TIMEOUT,5000);/读取超时

3.3自定义请求重试设置

见HttpClient 教程 (一).htm

4. 附1:使用get方式,获取百度首页内容

public static String gestDemos() throws HttpException, IOException {

String url = "/";

HttpClient httpClient = new HttpClient();

//创建方法实例

HttpMethod get = new GetMethod(url);

//执行get方法

eMethod(get);

//获取返回的页面内容

String content = ponseBodyAsString();

//释放链接资源

eConnection();

return content;

}

5. 附2:使用post方式,提交参数,查询手机归属地

public static String post() {

HttpClient httpClient = new DefaultHttpClient();

String url = "/";

List nameValuePair = new ArrayList();

(new BasicNameValuePair("mob", "1330227"));

try {

//声明一个url-encoded 实体

UrlEncodedFormEntity urlEntity = new

UrlEncodedFormEntity(nameValuePair,"utf-8");

//声明使用post的方法提交请求

HttpPost post = new HttpPost(url);

ity(urlEntity);

//执行post请求

HttpResponse response = e(post);

//获取响应实体

HttpEntity entity = ity();

String content = "";

if (entity != null) {

}

return content;

n("========服务器返回内容======");

content = ng(entity,"utf-8");

}catch (Exception e) {

n("------Exception-------");

tackTrace();

return null;

//关闭连接资源

nectionManager().shutdown();

}

}finally{

2023年8月3日发(作者:)

一、 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包:

,下载地址:

/dist/httpcomponents/commons-httpclient/binary/;

,下载地址:

/logging/download_;

,下载地址:

/codec/download_;

2. HttpClient 4所需的基本jar包:

下载地址:/;

最新版本为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("/");

2.3 调用实例httpClient的executeMethod方法来执行getMethod。由于是执行在网络上的程序,在运行executeMethod方法的时候,需要处理两个异常,分别是HttpException和IOException。引起第一种异常的原因主要可能是在构造getMethod的时候传入的协议不对,比如不小心将"http"写成"htp",或者服务器端返回的内容不正常等,并且该异常发生是不可恢复的;第二种异常一般是由于网络原因引起的异常,对于这种异常

(IOException),HttpClient会根据你指定的恢复策略自动试着重新执行executeMethod方法。HttpClient的恢复策略可以自定义(通过实现接口HttpMethodRetryHandler来实现)。通过httpClient的方法setParameter设置你实现的恢复策略。executeMethod返回值是一个整数,表示了执行该方法后服务器返回的状态码,该状态码能表示出该方法执行是否成功、需要认证或者页面发生了跳转(默认状态下GetMethod的实例是自动处理跳转的)等。

//设置成了默认的恢复策略,在发生异常时候将自动重试3次,在这里你也可以设置成自定义的恢复策略

ams().setParameter(_HANDLER,

new DefaultHttpMethodRetryHandler());

//执行getMethod

int statusCode = eMethod(getMethod);

if (statusCode != _OK) {

n("Method failed: " + tusLine());

}

2.4 在返回的状态码正确后,即可取得内容。取得目标地址的内容有三种方法:第一种,getResponseBody(),该方法返回的是目标的二进制的byte流;第二种,getResponseBodyAsString(),这个方法返回的是String类型;第三种,getResponseBodyAsStream(),这个方法对于目标地址中有大量数据需要传输是最佳的。在这里我们使用了最简单的getResponseBody方法。

byte[] responseBody = ponseBody();

2.5 释放连接。无论执行方法是否成功,都必须释放连接。

eConnection();

2.6 处理内容。

n(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方法中去

uestBody(new NameValuePair[] { nameValuePair} );

如果传递多个参数,可以使用逗号隔开,即可。

4. 使用HttpClient3遇到的一些问题及解决方法 4.1 字符编码问题。

4.1.1有时候,当我们传递的参数中含有中文的时候,使用httpclient发送,web服务器无法识别,如果返回的http响应头中含有中文字符,也会出现乱码。解决的方法是修改httpclient的参数。

ams().setHttpElementCharset("UTF-8");

4.1.2 有时候,服务器返回的页面内容出现中文乱码,可以设置如下参数:

ams().setParameter(_CONTENT_CHARSET,

"UTF-8");

4.2超时的设置

4.2.1连接超时设置

pConnectionManager().getParams().setConnectionTimeout(5000);

4.2.2读取信息超时设置

pConnectionManager().getParams().setSoTimeout(1000);

4.3 自定义恢复策略

正如前文所说,当出现IOException异常时,httpclient可以根据我们指定的恢复策略自动试着重新执行executeMethod方法。如果我们不想让httpclient重新执行executeMethod(),或是不想让它重新执行3次,可以如下设置:

//不重试

ams().setParameter(_HANDLER,new

DefaultHttpMethodRetryHandler(0,false));

//重试1次

ams().setParameter(_HANDLER,

new DefaultHttpMethodRetryHandler(1,true));

我们也可以自定义恢复策略,通过实现HttpRequestRetryHandler接口,执行自定义的行为。

4.4 重定向问题

Httpclient的get的方法支持自动转向处理,而post方法不支持。当然我们也可以取消掉httpclient的自动转向处理,可以调用方法:

lowRedirects(false)。

我们可以根据执行过http方法后,根据得到的返回状态进行自定义处理。如果得到301代码,这时服务器返回的头信息中location的值就是sendRedirect转向的目标地址。可以通过以下方法读取新的url:

String newurl = ponseHeader("location").getValue();

一些常见的http状态码及含义:

200 获取到页面 _OK

301 永久移动. _MOVED_PERMANENTLY

302 临时移动. _MOVED_TEMPORARILY

303 See Other. _SEE_OTHER

307 临时重定向. _TEMPORARY_REDIRECT

4.5 设置代理

有些网站要浏览器才可以访问,但程序可以仿浏览器,主要是设置http头。

//设置代理服务器的ip地址和端口

tConfiguration().setProxy(ip,port);

//设置http头

List headers = new ArrayList(); (new Header("User-Agent",Mozilla/4.0 (compatible; MSIE 7.0; Windows NT

5.1)"));

tConfiguration().getParams().setParameter("t-headers",

headers);

四、 HttpClient 4.x基本功能的使用

1.

使用Get方式提交请求

1.1创建httpclient实例

HttpClient httpclient = new DefaultHttpClient();

1.2构建get方法实例

HttpGet httpget = new HttpGet("/");

1.3 执行方法,获得响应

HttpResponse response = e(httpget);

HttpEntity entity = ity();

1.4处理得到的http实体

n(ng(entity));//以String形式获取内容

EntityUtils. toByteArray(entity)//以二进制byte流形式

tent()//流的形式

1.5 释放连接资源(必须执行的)

nectionManager().shutdown();

2. 使用Post方式提交请求(参考HttpClient 教程 (一).htm)

2.1除了构建方法使用的是:

HttpPost httppost = new HttpPost("/");

其他的步骤与使用get方式相同。

2.2 传递参数

许多应用程序需要频繁模拟提交一个HTML表单的过程,比如,为了来记录一个Web应用程序或提交输出数据。HttpClient提供了特殊的实体类UrlEncodedFormEntity来这个满足过程。

List formparams = new ArrayList();

(new BasicNameValuePair("param1", "value1"));

(new BasicNameValuePair("param2", "value2"));

UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, "UTF-8");

HttpPost httppost = new HttpPost("localhost/");

ity(entity);

3. 使用HttpClient4遇到的一些问题及解决方法

3.1 字符编码

3.1.1参数中文乱码解决:

Get方式提交的乱码处理:

 对中文参数使用(src);来编码;

 设置GetMethod编码格式为utf-8:get_uestHeader("Content-type" ,

"text/html; charset=utf-8");

Post方式提交的乱码处理:

UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, "UTF-8");

3.1.2 内容中文乱码处理:

ng(entity,"utf-8"); 3.2超时设置

ams().setIntParameter(TION_TIMEOUT,5000);//连接超时

ams().setIntParameter(_TIMEOUT,5000);/读取超时

3.3自定义请求重试设置

见HttpClient 教程 (一).htm

4. 附1:使用get方式,获取百度首页内容

public static String gestDemos() throws HttpException, IOException {

String url = "/";

HttpClient httpClient = new HttpClient();

//创建方法实例

HttpMethod get = new GetMethod(url);

//执行get方法

eMethod(get);

//获取返回的页面内容

String content = ponseBodyAsString();

//释放链接资源

eConnection();

return content;

}

5. 附2:使用post方式,提交参数,查询手机归属地

public static String post() {

HttpClient httpClient = new DefaultHttpClient();

String url = "/";

List nameValuePair = new ArrayList();

(new BasicNameValuePair("mob", "1330227"));

try {

//声明一个url-encoded 实体

UrlEncodedFormEntity urlEntity = new

UrlEncodedFormEntity(nameValuePair,"utf-8");

//声明使用post的方法提交请求

HttpPost post = new HttpPost(url);

ity(urlEntity);

//执行post请求

HttpResponse response = e(post);

//获取响应实体

HttpEntity entity = ity();

String content = "";

if (entity != null) {

}

return content;

n("========服务器返回内容======");

content = ng(entity,"utf-8");

}catch (Exception e) {

n("------Exception-------");

tackTrace();

return null;

//关闭连接资源

nectionManager().shutdown();

}

}finally{