httpclient 4.5.2 学习随笔(1)

疑惑的地方

刚开始接触httpclient的同学可能会比较疑惑,因为你发现创建httpclient的方式有两种:

  1. HttpClient client = new HttpClient();
  2. CloseableHttpClient httpclient = HttpClients.createDefault();

到底该使用那种方式来创建httpclient,或者使用httpclient 又该导入哪些包。标号1中,是commons-httpclient 版本的创建方式,标号2是 httpclient的版本。这两个版本都可以处理http请求。我查阅了一下apach的官网看到了这样的一句话:

The Commons HttpClient project is now end of life, and is no longer being developed. It has been replaced by the Apache HttpComponents project in its HttpClient and HttpCore modules, which offer better performance and more flexibility.

大意是commons-httpclient项目不再提供更新和开发。看着这句话我们应该明白了,以后HttpClient client = new HttpClient() 这种创建httpclient 的方式,也应该会被我们弃用掉。新建的项目还是使用httpclient 吧。

之所以写这篇文档,也算是给自己做一个记录吧,httpclient4.5的版本变化还是比较大的,网络上的很多文档都是基于4.4写的,有点过时了。在学习官方文档,教程,源码的基础上,给自己留下一个学习的小脚印。

序言

HTTP也许是当今互联网上使用的最重要的协议了,尽管java.net包提供了访问HTTP资源的基本功能,但是因为它的不够灵活,使得Httpclient的应用更加广泛。HttpClient 不是一个浏览器,它是一个客户端的HTTP通信实现库,httpclient的目标是发送和接收报文。

小Demo
提供一个小demo ,看看这个httpclient到底该怎么用。

  1. pom.xml文件中导入jar包
<dependency>
   <groupId>org.apache.httpcomponents</groupId>
   <artifactId>httpclient</artifactId>
   <version>4.5.2</version>
</dependency>
  1. demo 程序
import org.apache.http.Consts;
import org.apache.http.HttpStatus;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

/**
 * describe
 *
 * @Author: soul
 * @Date: 2016/12/5
 * @since: JDK 1.8
 * @Version: v1.0
 */

public class Demo {
    public static void main(String[] args) throws IOException, URISyntaxException {
        example();
    }

    public static void example() throws URISyntaxException, IOException {
        //创建httpclient实例,采用默认的参数配置
        CloseableHttpClient httpClient = HttpClients.createDefault();
        //通过URIBuilder类创建URI
        URI uri = new URIBuilder().setScheme("http")
                    .setHost("www.baidu.com")
                    .build();

        HttpGet get = new HttpGet(uri) ;   //使用Get方法提交

        //请求的参数配置,分别设置连接池获取连接的超时时间,连接上服务器的时间,服务器返回数据的时间
        RequestConfig config = RequestConfig.custom()
                                           .setConnectionRequestTimeout(3000)
                                           .setConnectTimeout(3000)
                                           .setSocketTimeout(3000)
                                         .build();
        //配置信息添加到Get请求中
        get.setConfig(config);
        //通过httpclient的execute提交 请求 ,并用CloseableHttpResponse接受返回信息
        CloseableHttpResponse response = httpClient.execute(get);
        //服务器返回的状态
        int statusCode = response.getStatusLine().getStatusCode() ;
        //判断返回的状态码是否是200 ,200 代表服务器响应成功,并成功返回信息
        if(statusCode == HttpStatus.SC_OK){
            //EntityUtils 获取返回的信息。官方不建议使用使用此类来处理信息
            System.out.println("Demo.example -------->" + EntityUtils.toString(response.getEntity() , Consts.UTF_8));
        }else {
            System.out.println("Demo.example -------->" + "获取信息失败");
        }

    }
}

上面的程序基本上能满足一些简单的数据请求。总结下httpclient的使用步骤:

  • 创建httpclient实例
  • 创建httpmethod 方法实例 ,最常用的是HttpGet,HttpPost 类
  • httpclient 通过execute方法提交Get 或者Post 请求
  • 使用CloseableHttpResponse 来接受服务器返回的状态信息和实体信息
  • 关闭连接

HTTP 请求

所有的HTTP请求都有一个请求的起始行,由方法名,uri和HTTP协议版本组成 。
HttpClient很好的支持了HTTP/1.1规范中所有的HTTP方法:GET,HEAD,POST ,PUT ,DELETE ,TRACE 和 OPTIONS。每个方法都对应一个类:HttpGet,HttpHead,HttpPost,HttpPut,HttpDelete,HttpTrace和HttpOptions。
uri->统一资源定位符,包含了协议名称(http,https,ftp),主机名(www.xxx.com,www.xx.cn),可选端口(如果为80端口,可以省略),资源路径(/search),可选参数,可选片段等。
url如下:

http://www.google.com/search?hl=en&q=httpclient&btnG=Google+Search&aq=f&oq=

HttpClient提供了URIBuilder工具类来简化创建。修改request URI .

URI uri = new URIBuilder().setScheme("http")
            .setHost("www.google.com")
            .setPath("/search")
            .setParameter("q" ,"httpclient")
            .setParamter("btnG" ,"google+Serach")
            .build() ;
HttpGet get = new HttpGet(uri) ;
//除了使用URIBuilder工具类来创建连接,也可以直接采用字符串来定义uri
String url = http://www.google.com/search?hl=en&q=httpclient&btnG=Google+Search&aq=f&oq ;
HttpGet get = new HttpGet(url); 
//效果也是一样的

Http 响应

HTTP响应是服务器接收并解析请求信息后返回给客户端的信息,它的起始行包含了一个协议版本,一个状态和描述状态的短语。Http/1.1 , 200 ,Ok

HTTP 实体

HttpClient 分为三种实体:

  1. 流式实体:内容来源于一个流,或者在运行中产生。流式实体不可重复。
  2. 自我包含:内存中的内容,通过独立的链接/其他的实体获得的内容。自我包含实体可重复
  3. 包装实体:从另外一个实体中获得内容。

服务器返回的信息封装在了entity中,客户端通过调用response.getEntity 可以拿到该实体内容。通过HttpEntity#getContent()方法,可以将数据转换成一个InputStream流。或者提供一个输出流给HttpEntity#writeTo(Outputstream)方法,它将会返回写入给定流的所有内容。官方其实是不建议使用EntityUtils类的,除非响应的实体来自于信任的Http服务器,并且知道它的长度。

释放低级别的资源

为了确保正确的释放资源,你必须关掉与实体相关的内容流,还必须关掉响应流。

  • inputStrea.close()
  • response.close()

参考: http://blog.csdn.net/u011179993/article/details/47123727


少年听雨歌楼上,红烛昏罗帐。  
壮年听雨客舟中,江阔云低,断雁叫西风。
感谢支持!
                                        ---起个名忒难

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,580评论 18 139
  • apache下的httpclient工具可大大简化开发过程中的点对点通信,本人将以微信多媒体接口为例,展示http...
    划破的天空阅读 5,266评论 0 32
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,724评论 6 342
  • 梦到了木头,梦里还是跟原来一样,我们很恩爱,接着他就从我身边消失了,当我寻找他时,我看到了J,他抱着篮球在前面等我...
    b10b01c7584e阅读 212评论 0 0
  • 要进行iOS开发,肯定会遇到真机测试以及上线AppStore的问题,下面就简单介绍一下证书以及配置文件的使用...
    呵呵哈哈24阅读 646评论 0 1