HttpClient初探

   HttpClient是apach开源框架中的一个重要产品,封装了很多http操作(抱歉,用词不太专业),对于开发基于Http协议的应用,特别是基于http的c/s结构的应用提供了很多方便。具体内容bala-bala,可以登录http://hc.apache.org/去看和下载自己需要的东西。下面是我根据http://hc.apache.org/的提示利用HttpClient库运行起来的第一个Demo程序。一系列准备工作我觉的有必要说明下,特别是对第一次使用HtttpClient,又对英文比较头疼的菜鸟们(我也是其中一员)。

1.在官网下载HttpClient包,现在最新的是4.4的,但是由于是alpha版本,不够稳定,我们还是下载4.3GA(general available)版本的。解压后lib文件夹下就是我们要用的Jar包了。利用HttpClient开发程序时最好把这几个jar包都到到进入,省的出现class not found异常。这里强调下,官网还提供了一个AsyncHttpClient,故名思议,异步HttpClient。区别是:HttpClient使用的java 阻塞io模式,优点是低延迟,数据吞吐量大,但是由于每个客户连接都要建立一个线程,资源消耗比较大;AsyncHttpClient基于java nio(异步io,非阻塞io),可以更高效率的利用服务端资源和处理客户端Http连接,缺点是数据吞吐量没有HttpClient大,而且延迟会高一些。(任何一门编程技术其实都是有利弊的,获得一些优势就要牺牲一些的别的方面)

2.从官网下载HttpClient的源文件和HttpCore的源文件,在eclipse中绑定源文件,就可以直接在开发的时候查看javadoc和源文件了,不用再去查看在线帮助文档了。

3.有英语阅读条件的,最好从官网下个HttpClient的教程来看下,内容肯定很详细啦。我在附件中也上传了教程。

4.之前下载的HttpClient4.3库中还包含一些Demo,这对我们快速上手HttpClient开发很有用。下面是我运行的第一个Demo:
public class Test {
    public static void main(String[] args) throws Exception {

        //CloseableHttpClient是对HttpClient接口的实现,HttpClient是一个接口,是对http请求的抽象

       //这里用HttpClients工厂类得到一个默认配置的CloseableHttpClient,使用完后记得要将httpclient

       //close掉。
        CloseableHttpClient httpclient = HttpClients.createDefault();
        try {

            //这里连接的是百度的首页,执行Get请求
            HttpGet httpGet = new HttpGet("http://www.baidu.com");

            //CloseableHttpResponse是对HttpResponse和Closeable接口的继承

           //用完同样记得要关掉,否则CloseableHttpResponse底层将一直保持该Http连接。
            try {
                System.out.println(response1.getStatusLine());

                //这个entity是Http响应中的消息体,一般就是网页的文本内容
                HttpEntity entity1 = response1.getEntity();
                // do something useful with the response body
                // and ensure it is fully consumed

                //确保完整的读取到消息体并关闭消息体的流。
                EntityUtils.consume(entity1);
            } finally {
                response1.close();
            }
            //这里连接的是百度的首页,执行Post请求
            HttpPost httpPost = new HttpPost("http://www.baidu.com");

            //添加Post请求的参数(位于消息体中)
            List <NameValuePair> nvps = new ArrayList <NameValuePair>();
            nvps.add(new BasicNameValuePair("username", "vip"));
            nvps.add(new BasicNameValuePair("password", "secret"));
            httpPost.setEntity(new UrlEncodedFormEntity(nvps));

           //执行Post提交
            CloseableHttpResponse response2 = httpclient.execute(httpPost);
            try {
                System.out.println(response2.getStatusLine());
                HttpEntity entity2 = response2.getEntity();       
                EntityUtils.consume(entity2);
            } finally {
                response2.close();
            }
        } finally {
            httpclient.close();
        }
    }
}

5.执行代码,得到输出:

HTTP/1.1 200 OK
HTTP/1.1 302 Moved Temporarily

6.这是在wireshark中抓的包:

Get请求的内容:


HttpClient初探
 Get请求返回的结果:


HttpClient初探

这是消息体部分:
 
HttpClient初探

Post的请求:


HttpClient初探
 Post响应:


HttpClient初探

本人比较菜,不知到为什么Post请求给出发生302错误,我把post的name-value参数去掉仍然有这个错误,如果有大神知道请赐教。
 

相关推荐