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
(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
(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{
发布评论