- 浏览: 119148 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
awdxzc:
还能更复杂一点?
Ehcache缓存配置 -
polaris1119:
请问,用ibatis + postgreSQL,存储过程出入一 ...
postgre存储过程简单实用方法 (过程语言: PL/pgSQL) -
foxty:
name like '%'+?+'%'
这样不必对参数再进 ...
PreparedStatement 使用like 模糊查询 -
manjingtou:
呵呵,我用的就是8.3但是我没有使用 application ...
POSTGIS常用函数 -
MegRyan:
我数据库里面有754个 但是没有AddGeometryColu ...
POSTGIS常用函数
根据以上步骤,我们来编写用GET方法来取得某网页内容的代码。
- 大部分情况下 HttpClient 默认的构造函数已经足够使用。
HttpClient httpClient = new HttpClient();
- 创建GET方法的实例。在GET方法的构造函数中传入待连接的地址即可。用GetMethod将会自动处理转发过程,如果想要把自动处理转发过程去掉的话,可以调用方法setFollowRedirects(false)。
GetMethod getMethod = new GetMethod("http://www.ibm.com/");
- 调用实例httpClient的executeMethod方法来执行getMethod。由于是执行在网络上的程序,在运行executeMethod方法的时候,需要处理两个异常,分别是HttpException和IOException。引起第一种异常的原因主要可能是在构造getMethod的时候传入的协议不对,比如不小心将"http"写成"htp",或者服务器端返回的内容不正常等,并且该异常发生是不可恢复的;第二种异常一般是由于网络原因引起的异常,对于这种异常 (IOException),HttpClient会根据你指定的恢复策略自动试着重新执行executeMethod方法。HttpClient的恢复策略可以自定义(通过实现接口HttpMethodRetryHandler来实现)。通过httpClient的方法setParameter设置你实现的恢复策略,本文中使用的是系统提供的默认恢复策略,该策略在碰到第二类异常的时候将自动重试3次。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类型,值得注意的是该方法返回的String的编码是根据系统默认的编码方式,所以返回的String值可能编码类型有误,在本文的"字符编码"部分中将对此做详细介绍;第三种,getResponseBodyAsStream,这个方法对于目标地址中有大量数据需要传输是最佳的。在这里我们使用了最简单的getResponseBody方法。
byte[] responseBody = method.getResponseBody();
- 释放连接。无论执行方法是否成功,都必须释放连接。
method.releaseConnection();
- 处理内容。在这一步中根据你的需要处理内容,在例子中只是简单的将内容打印到控制台。
System.out.println(new String(responseBody));
下面是程序的完整代码,这些代码也可在附件中的test.GetSample中找到。
package test; import java.io.IOException; import org.apache.commons.httpclient.*; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.params.HttpMethodParams; public class GetSample{ public static void main(String[] args) { //构造HttpClient的实例 HttpClient httpClient = new HttpClient(); //创建GET方法的实例 GetMethod getMethod = new GetMethod("http://www.ibm.com"); //使用系统提供的默认的恢复策略 getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler()); try { //执行getMethod int statusCode = httpClient.executeMethod(getMethod); if (statusCode != HttpStatus.SC_OK) { System.err.println("Method failed: " + getMethod.getStatusLine()); } //读取内容 byte[] responseBody = getMethod.getResponseBody(); //处理内容 System.out.println(new String(responseBody)); } catch (HttpException e) { //发生致命的异常,可能是协议不对或者返回的内容有问题 System.out.println("Please check your provided http address!"); e.printStackTrace(); } catch (IOException e) { //发生网络异常 e.printStackTrace(); } finally { //释放连接 getMethod.releaseConnection(); } } } |
根据RFC2616,对POST的解释如下:POST方法用来向目的服务器发出请求,要求它接受被附在请求后的实体,并把它当作请求队列(Request-Line)中请求URI所指定资源的附加新子项。POST被设计成用统一的方法实现下列功能:
- 对现有资源的注释(Annotation of existing resources)
- 向电子公告栏、新闻组,邮件列表或类似讨论组发送消息
- 提交数据块,如将表单的结果提交给数据处理过程
- 通过附加操作来扩展数据库
调用HttpClient中的PostMethod与GetMethod类似,除了设置PostMethod的实例与GetMethod有些不同之外,剩下的步骤都差不多。在下面的例子中,省去了与GetMethod相同的步骤,只说明与上面不同的地方,并以登录清华大学BBS为例子进行说明。
- 构造PostMethod之前的步骤都相同,与GetMethod一样,构造PostMethod也需要一个URI参数,在本例中,登录的地址是http://www.newsmth.net/bbslogin2.php。在创建了PostMethod的实例之后,需要给method实例填充表单的值,在BBS的登录表单中需要有两个域,第一个是用户名(域名叫id),第二个是密码(域名叫passwd)。表单中的域用类NameValuePair来表示,该类的构造函数第一个参数是域名,第二参数是该域的值;将表单所有的值设置到PostMethod中用方法setRequestBody。另外由于BBS登录成功后会转向另外一个页面,但是HttpClient对于要求接受后继服务的请求,比如POST和PUT,不支持自动转发,因此需要自己对页面转向做处理。具体的页面转向处理请参见下面的"自动转向"部分。代码如下:
String url = "http://www.newsmth.net/bbslogin2.php"; PostMethod postMethod = new PostMethod(url); // 填入各个表单域的值 NameValuePair[] data = { new NameValuePair("id", "youUserName"), new NameValuePair("passwd", "yourPwd") }; // 将表单的值放入postMethod中 postMethod.setRequestBody(data); // 执行postMethod int statusCode = httpClient.executeMethod(postMethod); // HttpClient对于要求接受后继服务的请求,象POST和PUT等不能自动处理转发 // 301或者302 if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY || statusCode == HttpStatus.SC_MOVED_TEMPORARILY) { // 从头中取出转向的地址 Header locationHeader = postMethod.getResponseHeader("location"); String location = null; if (locationHeader != null) { location = locationHeader.getValue(); System.out.println("The page was redirected to:" + location); } else { System.err.println("Location field value is null."); } return; }
发表评论
-
Comet4J实现推送服务
2015-03-03 11:13 0Comet4J实现推送服务 -
java web 导出excel
2012-11-03 12:44 993看到这个标题,会很疑问,java导出excel 有很多文章呀, ... -
LIST合并单元格效果
2011-10-17 14:40 13551,在今天整理代码的时候,发现原来的一段代码,前台合并单元格。 ... -
hibernate 一对多集合 set查询问题
2011-08-19 17:20 1123今天解决了一个问题( ... -
hibernate lazy
2011-08-12 13:15 1189今天项目组有要使用的hibernate lazy的,我一直对这 ... -
struts2 泛型 Hibernate
2011-05-07 17:51 2788今天在整理代码的时候 ... -
org.apache.commons.beanutils.BeanUtils No value specified
2010-11-29 11:22 2073今天遇到一个问题,正如题目的在进行 form到 Bean的复制 ... -
AXIS WebService
2010-11-25 18:13 1516这段时间重构一下原来的代码,把东西整理一下。这个为AXIS的整 ... -
Web Services
2010-11-25 16:12 925web 服务是通过标准的web协议可以访问的一个应用程序组件。 ... -
Cookie 和 Session
2010-10-25 17:07 773一、cookie机制和session机制的区别******** ... -
spring 常识2
2010-10-19 23:00 12301, Spring bean 定义 spring bean ... -
spring 常识1
2010-10-19 22:06 7401,实例化bean就Spring Io ... -
Ehcache分布式缓存
2010-08-19 19:44 2014Ehcache分布式缓存也是我一直比较较关注的,以前用过osc ... -
Ehcache缓存配置
2010-08-19 19:18 2063近期项目用到Ehcache,以前项目主要用到Oscache,并 ... -
hibernate 查询效率(1)
2010-02-24 16:47 1595相信越来越多的web开发者,在持久层都采用了hibernate ... -
servlet线程安全问题分析(网上整理)
2009-03-02 10:56 929这两天在整理些基础的资料,在网上看到了这篇文章Servlet/ ... -
httpclient (1)
2008-01-29 14:50 1125最近用到了HttpClient ,搜集的资料: HttpCl ... -
spring ApplicationContext简单研究
2008-03-11 09:57 1378spring 研究装载配置文件 1,研究spring webA ... -
quartz在spring中的使用
2008-03-17 09:29 830(1)在spring 中的配置bean (1)在spring ... -
有关web效率
2008-03-18 10:10 10991)web开发的特点是是:没有太复杂的技术难点,一切在于迅速的 ...
相关推荐
HttpClient Post提交多文件及多个普通参数,已经封装成工具类。 需传入 要请求的url 普通参数map 例 map.put("param1","张三"); 需要传入的文件流map 其中key为文件名 服务端接收无乱码。
使用三种方案实现网页爬虫: 1、httpclient 2、jsoup 3、httpclient+jsoup
HttpClient汇总工具类 HttpClient汇总工具类HttpClient汇总工具类HttpClient汇总工具类
2.commons-logging-1.2.jar 3.fluent-hc-4.5.jar 4.httpclient-4.5.jar 5.httpclient-cache-4.5.jar 6.httpclient-win-4.5.jar 7.httpcore-4.4.1.jar 8.httpmime-4.5.jar 9.jna-4.1.0.jar 10.jna-platform-4.1.0.jar
赠送jar包:httpclient-4.5.6.jar; 赠送原API文档:httpclient-4.5.6-javadoc.jar; 赠送源代码:httpclient-4.5.6-sources.jar; 赠送Maven依赖信息文件:httpclient-4.5.6.pom; 包含翻译后的API文档:httpclient...
httpclient
赠送jar包:httpclient-4.5.13.jar; 赠送原API文档:httpclient-4.5.13-javadoc.jar; 赠送源代码:httpclient-4.5.13-sources.jar; 赠送Maven依赖信息文件:httpclient-4.5.13.pom; 包含翻译后的API文档:...
httpClient完整封装获取网页信息、数据的代码+httpclient.jar
import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.HttpException; import org.apache.commons.httpclient.HttpStatus; import org.apache.commons.httpclient.methods....
httpClient的get请求方式2 * @return * @throws Exception */ public static String doGet(String url, String charset) throws Exception { /* * 使用 GetMethod 来访问一个 URL 对应的网页,实现步骤: 1:...
赠送jar包:httpclient-4.5.13.jar; 赠送原API文档:httpclient-4.5.13-javadoc.jar; 赠送源代码:httpclient-4.5.13-sources.jar; 赠送Maven依赖信息文件:httpclient-4.5.13.pom; 包含翻译后的API文档:...
赠送jar包:httpclient-4.5.5.jar; 赠送原API文档:httpclient-4.5.5-javadoc.jar; 赠送源代码:httpclient-4.5.5-sources.jar; 包含翻译后的API文档:httpclient-4.5.5-javadoc-API文档-中文(简体)版.zip ...
httpclient.jar下载 包括code.jar包
帮助程序员快速从Apache的HttpClient 3.x升级到HttpClient 4.x
HttpClient的一个封装, HttpClient的一个封装
C# HttpClientHelper(HttpClient工具类) 包含 同步/异步请求 返回 string/泛型类型/Xml 及一个单例模式 的 SingleHelper 适合做爬虫
HttpClient 4.5.3 (GA) is a maintenance release that fixes a number of defects found since 4.5.2. Please note that as of 4.4 HttpClient requires Java 1.6 or newer. Changelog: ------------------- * ...
httpClient4.3.6 HttpClient使用详解 httpClient中文帮助文档
httpclient jar包 httpclient jar包 httpclient jar包