我是靠谱客的博主 可爱太阳,最近开发中收集的这篇文章主要介绍httpClient的使用(一),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1、是什么?
是客户端编程工具包。
可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包
----------------------
2、有什么用?
一句话:用它来发送和接收HTTP报文。

越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源

HttpClient 提供的主要的功能:
(1)实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
(2)支持自动转向
(3)支持 HTTPS 协议
(4)支持代理服务器等

-----------------------------
3、怎么用?

Get请求
http 请求包括get方式和post 方式

get方式会将发送的参数信息显示在浏览器的地址栏中。

4、具体内容
(1)下载相关的jar包。下载地址:http://hc.apache.org/downloads.cgi
下载页面里的httpClient 4.4.1(GA)中Binary里的4.4.1.zip[md5][pgp]。解压后找到lib目录下的所有jar包,导入到工程中,完成配置。(第一次自己弄走了无数弯路,唉),目录tutorial里面还有一个英文的教程,有中文版网上可以找到。
可以下载Source目录下的4.4.1.zip,解压后可以导入工程,是刚刚导入jar包的源代码,应该导入目录httpclient下的src文件夹。同时下载的还有一些例子。
(2)使用:

1.1执行请求

        //创建HttpClient
        HttpClient httpclient = new DefaultHttpClient();
        //创建HttpGet
        HttpGet httpget = new HttpGet("http://v.baidu.com/");
        //创建HttpResponse
        HttpResponse response;
        try 
        {
            //发送请求,得到响应
            response = httpclient.execute(httpget); 

1.1.1HTTP请求
HTTP 响应是由服务器在接收和解释请求报文之后返回发送给客户端的报文;响应报文
的第一行包含了协议版本,之后是数字状态码和相关联的文本段。

HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,
HttpStatus.SC_OK, "OK"); System.out.println(response.getProtocolVersion()); System.out.println(response.getStatusLine().getStatusCode()); System.out.println(response.getStatusLine().getReasonPhrase()); System.out.println(response.getStatusLine().toString());

输出内容为:

HTTP/1.1
200
OK
HTTP/1.1 200 OK

1.1.3 处理报文头部
一个 HTTP 报文可以包含很多描述如内容长度,内容类型等信息属性的头部信息;
HttpClient 提供获取,添加,移除和枚举头部信息的方法。

HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1,HttpStatus.SC_OK, "OK");
        //添加头部信息
        response.addHeader("Set-Cookie","c1=a; path=/; domain=localhost");
        response.addHeader("Set-Cookie","c2=b; path="/", c3=c; domain="localhost"");
        //获取头部信息
        Header h1 = response.getFirstHeader("Set-Cookie"); 
        System.out.println(h1);
        Header h2 = response.getLastHeader("Set-Cookie"); 
        System.out.println(h2);
        //枚举头部信息
        Header[] hs = response.getHeaders("Set-Cookie"); 
        System.out.println(hs.length);

输出为:

Set-Cookie: c1=a; path=/; domain=localhost Set-Cookie: c2=b; path="/", c3=c; domain="localhost" 
2

获得给定类型的所有头部信息最有效的方式是使用 HeaderIterator 接口。

HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "OK");
        response.addHeader("Set-Cookie","c1=a; path=/; domain=localhost");
        response.addHeader("Set-Cookie","c2=b; path="/", c3=c; domain="localhost"");
        //获得给定类型的所有头部信息
        HeaderIterator it = response.headerIterator("Set-Cookie"); 
        while (it.hasNext()) 
        {
                System.out.println(it.next()); 
        }

输出为:

Set-Cookie: c1=a; path=/; domain=localhost
Set-Cookie: c2=b; path="/", c3=c; domain="localhost"

它也提供解析 HTTP 报文到独立头部信息元素的方法方法。

HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "OK");
        response.addHeader("Set-Cookie","c1=a; path=/; domain=localhost");
        response.addHeader("Set-Cookie","c2=b; path="/", c3=c; domain="localhost"");
        //迭代器
        HeaderElementIterator it = new BasicHeaderElementIterator( response.headerIterator("Set-Cookie"));
        while (it.hasNext()) 
        {
            //头部的元素
            HeaderElement elem = it.nextElement();
            //两个方法
            System.out.println(elem.getName() + " = " + elem.getValue());

            org.apache.http.NameValuePair[] params = elem.getParameters();
            for (int i = 0; i < params.length; i++) 
            {
               System.out.println(" " + params[i]); 
            }
        }

输出为:

c1 = a
path=/ 
domain=localhost 
c2 = b
path=/
c3 = c 
domain=localhost

1.1.4 HTTP实体
TTP 报文可以携带和请求或响应相关的内容实体。实体可以在一些请求和响应中找到, 因为它们也是可选的。
使用了实体的请求被称为封闭实体请求。
HTTP 规范定义了两种封闭 实体的方法:POST 和 PUT。

1.1.4.1 重复实体
实体可以重复,意味着它的内容可以被多次读取。这就仅仅是自我包含式的实体了(像
ByteArrayEntity 或 StringEntity)。
1.1.4.2 使用 HTTP 实体
实体是当使用封闭内容执行请求,或当请求已经成功执行,或当响应体结果发送到客户端时创建的。
要从实体中读取内容,
可以通过 HttpEntity#getContent()方法从输入流中获取, 这会返回一个 java.io.InputStream 对象,
或者提供一个输出流到 HttpEntity#writeTo(OutputStream)方法中,这会一次返回所有写入到给定流中 的内容。

为一个传出报文创建实体时,这个元数据不得不通过实体创建器来提供。

//创建实体
        StringEntity myEntity = new StringEntity("important message", "UTF-8");
        //得到元数据的存储头部信息
        System.out.println(myEntity.getContentType()); 
        //得到内容长度
        System.out.println(myEntity.getContentLength());
        //
        System.out.println(EntityUtils.getContentCharSet(myEntity)); 
        //得到内容
        System.out.println(EntityUtils.toString(myEntity)); 
        //转为字节数组后输出长度
        System.out.println(EntityUtils.toByteArray(myEntity).length);

输出为:

Content-Type: text/plain; charset=UTF-8 17
UTF-8
important message
17

1.1.5 确保低级别资源释放

HttpClient httpclient = new DefaultHttpClient();
        HttpGet httpget = new HttpGet("http://localhost/"); 
        HttpResponse response = httpclient.execute(httpget);
        //得到响应消息实体
        HttpEntity entity = response.getEntity();
        if (entity != null) 
        {
            InputStream instream = entity.getContent(); 
            int byteOne = instream.read();
            int byteTwo = instream.read();
            // 终止连接请求,节省资源
            httpget.abort(); 
        }

1.1.6 消耗实体内容

HttpClient httpclient = new DefaultHttpClient();
        HttpGet httpget = new HttpGet("http://localhost/");
        HttpResponse response = httpclient.execute(httpget); 
        HttpEntity entity = response.getEntity();
        if (entity != null) 
        {
            //输出内容长度
            long len = entity.getContentLength(); 
            //
            if (len != -1 && len < 2048) 
            {
                System.out.println(EntityUtils.toString(entity));
            } 
            else 
            {
                // Stream content out }
            }
        }

在一些情况下可能会不止一次的读取实体。此时实体内容必须以某种方式在内存或磁盘 上被缓冲起来。最简单的方法是通过使用 BufferedHttpEntity 类来包装源实体完成。 这会引起源实体内容被读取到内存的缓冲区中。在其它所有方式中,实体包装器将会得到源 实体。

HttpGet httpget = new HttpGet("http://localhost/"); HttpResponse response = httpclient.execute(httpget); HttpEntity entity = response.getEntity();
if (entity != null) {
entity = new BufferedHttpEntity(entity); }

1.1.7 生成实体内容
HttpClient 为很多公用的数据容器,比如字符串,字节数组,输入流和文件 提供了一些类:StringEntity,ByteArrayEntity,InputStreamEntity 和 FileEntity。

File file = new File("somefile.txt");
        //得到内容
        FileEntity entity = new FileEntity(file, "text/plain; charset="UTF-8"");
        //创建Post对象
        HttpPost httppost = new HttpPost("http://localhost/action.do");
        //发送Post
        httppost.setEntity(entity);

请注意 InputStreamEntity 是不可重复的,因为它仅仅能从低层数据流中读取一 次内容。通常来说,我们推荐实现一个定制的 HttpEntity 类,这是自我包含式的,用来 代替使用通用的 InputStreamEntity。FileEntity 也是一个很好的起点。
1.1.7.1 动态内容实体
通常来说,HTTP 实体需要基于特定的执行上下文来动态地生成。通过使用 EntityTemplate 实体类和 ContentProducer 接口,HttpClient 提供了动态实体的支 持。内容生成器是按照需求生成它们内容的对象,将它们写入到一个输出流中。它们是每次 被请求时来生成内容。所以用 EntityTemplate 创建的实体通常是自我包含而且可以重 复的。

//接口
    ContentProducer cp = new ContentProducer() 
    {
        public void writeTo(OutputStream outstream) throws IOException 
        {
            Writer writer = new OutputStreamWriter(outstream, "UTF-8");
            writer.write("<response>");
            writer.write(" <content>");
            writer.write(" important stuff");
            writer.write(" </content>"); 
            writer.write("</response>"); 
            writer.flush();
        }
    };
    //新建
    HttpEntity entity = new EntityTemplate(cp);
    //新建
    HttpPost httppost = new HttpPost("http://localhost/handler.do");
    //发送Post请求
    httppost.setEntity(entity);

1.1.7.2 HTML 表单
未完待续。

参考:http://blog.csdn.net/wangpeng047/article/details/19624529

最后

以上就是可爱太阳为你收集整理的httpClient的使用(一)的全部内容,希望文章能够帮你解决httpClient的使用(一)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部