zoukankan      html  css  js  c++  java
  • HttpClient简介

     

    栏目:Web开发 作者:admin 日期:2015-05-02 评论:0 点击: 204 次

    虽然在JDK的java net包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。现在HttpClient最新版本为 HttpClient 4.4 (GA) (2015-02-05)
    HttpClient 提供的主要的功能包括下面内容:
    (1)实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
    (2)支持自动转向
    (3)支持 HTTPS 协议
    (4)支持代理服务器等

    HttpClient的用法十分简单,先给大家看一个小例子:

    http://swiftlet.net/archives/824

    上面的例子,比较简单,一般是很容易看懂的,HttpClient最常见的用法是get和post方面,见下面这篇文

    HttpClient基本用法(二)

    栏目:Web开发 作者:admin 日期:2015-05-02 评论:3 点击: 839 次

    GET方法

    使用 HttpClient 需要以下6个步骤:
    1. 创建 HttpClient 的实例
    2. 创建某种连接方法的实例,在这里是GetMethod。在 GetMethod 的构造函数中传入待连接的地址。
    3. 调用第一步中创建好的实例的execute方法来执行第二步中创建好的method 实例
    4. 读 response
    5. 释放连接。无论执行方法是否成功,都必须释放连接
    6. 对得到后的内容进行处理
    根据以上步骤,我们来编写用GET方法来取得某网页内容的代码。
    第一步:大部分情况下 HttpClient 默认的构造函数已经足够使用。HttpClient httpClient = new DefaultHttpClient();
    第二步:创建GET方法的实例。在GET方法的构造函数中传入待连接的地址即可。用GetMethod将会自动处理转发过程,如果想要把自动处理转发过程 去掉的话,可以调用方法setFollowRedirects(false)。GetMethod getMethod = new GetMethod("url");
    第三步:调用实例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));
    下面是程序的完整代码:

    POST方法

    根据RFC2616,对POST的解释如下:POST方法用来向目的服务器发出请求,要求它接受被附在请求后的实体,并把它当作请求队列(Request-Line)中请求URI所指定资源的附加新子项。POST被设计成用统一的方法实现下列功能:
    对现有资源的注释(Annotation of existing resources)
    向电子公告栏、新闻组,邮件列表或类似讨论组发送消息
    提交数据块,如将表单的结果提交给数据处理过程
    通过附加操作来扩展数据库
    调用HttpClient中的PostMethod与GetMethod类似,除了设置PostMethod的实例与GetMethod有些不同之外,剩 下的步骤都差不多。在下面的例子中,省去了与GetMethod相同的步骤,只说明与上面不同的地方,并以登录清华大学BBS为例子进行说明。
    构造PostMethod之前的步骤都相同,与GetMethod一样,构造PostMethod也需要一个URI参数。在创建了PostMethod的 实例之后,需要给method实例填充表单的值,在BBS的登录表单中需要有两个域,第一个是用户名(域名叫id),第二个是密码(域名叫 passwd)。表单中的域用类NameValuePair来表示,该类的构造函数第一个参数是域名,第二参数是该域的值;将表单所有的值设置到 PostMethod中用方法setRequestBody。另外由于BBS登录成功后会转向另外一个页面,但是HttpClient对于要求接受后继服 务的请求,比如POST和PUT,不支持自动转发,因此需要自己对页面转向做处理。具体的页面转向处理请参见下面的"自动转向"部分。代码如下:
    String url = "....";
    PostMethod postMethod = new PostMethod(url);
    // 填入各个表单域的值
    NameValuePair[] data = { new NameValuePair("id", "yourUserName"),
    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;
    }

  • 相关阅读:
    读书笔记之理想设计的特征
    一些javascript 变量声明的 疑惑
    LINQ 使用方法
    Google MySQL tool releases
    读书笔记之设计的层次
    EF之数据库连接问题The specified named connection is either not found in the configuration, not intended to be used with the Ent
    转载 什么是闭包
    javascript面向对象起步
    Tips
    数据结构在游戏中的应用
  • 原文地址:https://www.cnblogs.com/zhengah/p/4758028.html
Copyright © 2011-2022 走看看