浅谈httpClient使用总结

目前C/S还是B/S结构的应用程序, HTTP 应该是最为广泛使用的协议了。在 Java 平台上,Java 标准库提供了 一个HttpURLConnection 类来支持 HTTP 通讯。不过 HttpURLConnection 本身的 API 不够友好,所提供的功能也有限。httpClien是一个实现http协议很多操作功能的组件,并且它支持 HTTP 协议最新的版本和建议,现在Android已经成功的集成了HttpClient。另外,最新由Square 公司开源的 OkHttp 据说能提供更高效率的http连接,支持GZIP 压缩和 HTTP 响应缓存功能,在原理上应该是大同小异的。

再说httpclient ,那也是眼花缭乱。随便一搜,比如有些博文使用了 org.apache.commons.httpclient.HttpClient ,有些博文用org.apache.http.client.HttpClient 类。原来,httpclient本来是属于apache-commons 项目下的一个子项目,后来是由Apache HttpComponents项目开发了后面的版本以提供更好的性能和更大的灵活性。commons下的这个httpclient最高版本是目前的3.1,支持HTTP协议1.1,继承了java.net.urlConnection,已经足够提供目前测试的大部分rest服务接口,本文介绍一下用法。这里可以查看所有的API - http://hc.apache.org/httpclient-3.x/apidocs/overview-summary.html

  在金融产品的测试过程中,我曾经碰到的服务接口有区分,比如与合作方交互一般是传xml较多,单应用的后台一般是http rest服务。这里提供一个传json的例子。

public void urlPostJson(String url,String desc,String json) {
        log.info("-----------------------------"+desc+"  Request: " + json);
        HttpClient client = new HttpClient();
        client.getHostConfiguration().setProxy("127.0.0.1", 5689);
        client.getHttpConnectionManager().getParams().setConnectionTimeout(3000);//        client.setConnectionTimeout(3000);
        client.getParams().setSoTimeout(3000);//        client.setTimeout(1000);
        client.getParams().setConnectionManagerTimeout(1000);
        PostMethod method = new PostMethod(url);
        try {
//            method.setRequestHeader("Content-Type", " application/json; charset=UTF-8");
            method.setRequestBody(new ByteArrayInputStream(json.getBytes("UTF-8")));
//            method.setRequestBody(json);
            int status = client.executeMethod(method);
            String res=method.getResponseBodyAsString();
            log.info("                               status:"+status+"  Resonse: "+res);
        } catch (IOException e) {
            log.error("HttpClient.executeMethod(postMethod) IOException!",e);
        }finally{
            if (method != null) {
                method.releaseConnection();
            }
        }
    }

如上,利用httpclient去访问接口的步骤一般是:

1. 创建HttpClient对象。2. 构造Http 请求对象。3. 执行HttpClient对象的execute方法,将Http请求对象作为该方法的参数。4. 读取execute方法返回的HttpResponse结果并解析。5、释放连接。整个过程是不是与我们平时在浏览器上访问类似呢。唯一区别是不能执行HTTP页面中签入嵌入的JS代码,自然也不会对页面内容进行任何解析、处理,这些都是需要开发人员来完成的。在以上代码中,httpclient的初始化没有看到任何参数设置,其实是在它的构造函数里调用了接口,并设置了默认值,如下包含协议版本、客户端引擎、cookie策略等,如果要自己设置,可以通过它的成员变量httpClientParams对象进行设置。

1、关于重定向。

http多种状态已经在HttpStatus这个类中定义好,其中重定向 根据RFC2616中对自动转向的定义,主要有两种:301和302。301表示永久的移走(Moved Permanently),当返回的是301,则表示请求的资源已经被移到一个固定的新地方,任何向该地址发起请求都会被转到新的地址上。302表示暂时的转向,比如在服务器端的servlet程序调用了sendRedirect方法,则在客户端就会得到一个302的代码,这时服务器返回的头信息中location的值就是sendRedirect转向的目标地址。如果是get方式请求,httpclient是自动帮你重定向并拿到响应信息,也可以通过设置method.setFollowRedirects(false)不自动转。post的请求是不能自动跳转的,需要从头部信息中拿到Location(可能是相对路径)因此需要对location返回的值做一些处理才可以发起向新地址的请求。

2、字符编码

客户端发送的数据多样,最终所有数据都是通过最底层的物理层面的电信号来传递,首部字段content-type 说明了实体主体内对象的媒体类型,即服务器通过contentType来知道这个是什么样子的数据。客户端在拿到服务器返回的数据后,根据头部设置的可接收媒体类型进行内容协商,返回最适合的资源。对于有中文的请求,为避免出现乱码,最好设置content-type。在上部分的代码截图,大家可以看到,如果我们自己不设置contentType 那么默认会采用ISO的方式进行传输,那么如果与你实际的编码方式不一致的话,服务器就会拿到一个乱码,从而无法正常的响应。可以通过上面代码进行设置,也可以通过method.setRequestHeader("Content-Type", " application/json; charset=UTF-8")来进行设置

3、cookie

httpclient默认的cookie策略是RFC_2109其中可以通过去更改。请求过程中可以通过sendHead 把cookie放入头部,并传到后端进行访问。

总结:

基本上使用httpclient过程中,主要操作的类有:httpclient,getMethod,postMethod,httpClientParams,httpConnectionManager这几个。详见以下的类图。

HttpClient代表了一个http的客户端,HttpConnectionManager是用来管理HttpConnection 的,HttpConnection代表了一个http连接,所以HttpConnectionManager其实质上也就是一个http连接池,管理这些 http连接(和数据库连接池一个道理)。HttpMethod代表了一个Http方法,一个HttpClient可以运行多个HttpMethod(实 质上,httpclient执行一个HttpMethod时,会从connectionmanager那里获取一个httpconnection,在此 connection上执行该method,执行完该method后,让method 释放该httpconnection,从而将该httpconnection返回给connectionmanager,以便供后续的method使 用)所以在httpclient连接后资源释放问题很重要,就跟我们用database connection要释放资源一样。

4、小tips

1、fidder作为一款强大好用的web调试利器,针对commons下的httpclient可以如下设置代理,能帮你记录下请求和响应的所有信息。 接口测试中遇到异常方便查看,减少自己debug的情况。

5、扩展

httpclient功能之强大,不是一篇文章能够说完。其他的,例如文件上传、DNS配置、多线程下的httpclient使用。过程中需要你对http协议、cookie-session机制有一定的认识基础。本篇文件旨在用做一些简单接口的测试,目前commons这个版本已经不做更新了,如果有更复杂的接口,还是推荐使用org.apache.http.impl.client下的httpclient。

时间: 2024-07-31 03:12:23

浅谈httpClient使用总结的相关文章

浅谈HttpClient

HttpClient简介 HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议.HttpClient支持的功能如下: 支持Http0.9.Http1.0和Http1.1协议. 实现了Http全部的方法(GET,POST,PUT,HEAD 等). 支持HTTPS协议. 支持代理服务器. 提供安全认证方案. 提供连接池以便重用连接. 连接管理器支持多线

浅谈微服务架构与服务治理的Eureka和Dubbo

前言 本来计划周五+周末三天自驾游,谁知人算不如天算,周六恰逢台风来袭,湖州附近的景点全部关停,不得已只能周五玩完之后,于周六踩着台风的边缘逃回上海.周末过得如此艰难,这次就聊点务虚的话题,一是浅谈微服务的架构设计,二是聊聊微服务中广泛用于服务治理的Eureka与RPC框架Dubbo异同点. 一.微服务的架构设计 之所以想聊一下这个话题,主要有感于最近接触的两个新的微服务项目--两个项目的架构设计出自两个人之手,却不约而同的使用了相同的设计理念,项目结构非常类似.又想到就职于上家公司时接触到的项

.net中对象序列化技术浅谈

.net中对象序列化技术浅谈 2009-03-11 阅读2756评论2 序列化是将对象状态转换为可保持或传输的格式的过程.与序列化相对的是反序列化,它将流转换为对象.这两个过程结合起来,可以轻松地存储和传输数 据.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象.反之,反序列化根据流重新构造对象.此外还可以将对象序列化后保存到本地,再次运行的时候可以从本地文件 中“恢复”对象到序列化之前的状态.在.net中有提供了几种序列化的方式:二进制序列化

浅谈——页面静态化

现在互联网发展越来越迅速,对网站的性能要求越来越高,也就是如何应对高并发量.像12306需要应付上亿人同时来抢票,淘宝双十一--所以,如何提高网站的性能,是做网站都需要考虑的. 首先网站性能优化的方面有很多:1,使用缓存,最传统的一级二级缓存:2,将服务和数据库分开,使用不同的服务器,分工更加明确,效率更加高:3,分布式,提供多台服务器,利用反向代理服务器nginx进行反向代理,将请求分散开来:4,数据库的读写分离,不同的数据库,将读操作和写操作分开,并实时同步即可:5,分布式缓存,使用memc

单页应用SEO浅谈

单页应用SEO浅谈 前言 单页应用(Single Page Application)越来越受web开发者欢迎,单页应用的体验可以模拟原生应用,一次开发,多端兼容.单页应用并不是一个全新发明的技术,而是随着互联网的发展,满足用户体验的一种综合技术. SEO 一直以来,搜索引擎优化(SEO)是开发者容易忽略的部分.SEO是针对搜索(Google.百度.雅虎搜索等)在技术细节上的优化,例如语义.搜索关键词与内容相关性.收录量.搜索排名等.SEO也是同行.市场竞争常用的的营销手段.Google.百度的搜

浅谈html标签

浅谈html各常用标签用法 标题标签:<h1>-<h6>来表示,使标题字体变粗. <br />换行标记 <hr />水平分隔符 &nbsp空格符 &copy版权符 <a href>a标签超链接 href可接链接地址 <p>段落标签<blockquote>引用标签及可用做缩进 <table>表格中的<ul>无序列表<ol>有序列表<dl>自定义列表<row

浅谈二维中的树状数组与线段树

一般来说,树状数组可以实现的东西线段树均可胜任,实际应用中也是如此.但是在二维中,线段树的操作变得太过复杂,更新子矩阵时第一维的lazy标记更是麻烦到不行. 但是树状数组在某些询问中又无法胜任,如最值等不符合区间减法的询问.此时就需要根据线段树与树状数组的优缺点来选择了. 做一下基本操作的对比,如下图. 因为线段树为自上向下更新,从而可以使用lazy标记使得矩阵的更新变的高校起来,几个不足就是代码长,代码长和代码长. 对于将将矩阵内元素变为某个值,因为树状数组自下向上更新,且要满足区间加法等限制

[nRF51822] 14、浅谈蓝牙低功耗(BLE)的几种常见的应用场景及架构(科普类干货)

蓝牙在短距离无线通信领域占据举足轻重的地位—— 从手机.平板.PC到车载设备, 到耳机.游戏手柄.音响.电视, 再到手环.电子秤.智能医疗器械(血糖仪.数字血压计.血气计.数字脉搏/心率监视器.数字体温计.耳温枪.皮肤水分计等), 再到智能家居等领域均占有一席之地. 而蓝牙低功耗(BLE)是在蓝牙4.0协议上修改以适用低功耗应用场景的一种蓝牙协议. 随着上一股智能消费类电子大潮的到来,BLE的各种应用也像雨后春笋般在市场上铺开. 如果想 紧跟蓝牙协议的最新动态 ,可以在https://www.b

浅谈C++容器动态内存管理的优化

在信息学竞赛中,C++的容器的用途非常广泛,但经常因常数过大而超时.怎样才能提高它们的效率呢? 我们知道,容器是存储同一类对象的对象,既然"对象"我们无法改变,那么我们只能从"存储"入手,不难想到,不同容器在实现上的根本区别是它们对应着不同的内存组织方式,内存管理无疑是这种实现的核心,所以优化内存管理是加快容器效率的最好途径之一. 一.内存分配器简介 怎样才能优化内存管理呢?很简单,C++为我们提供了这样的接口,我们可以通过自定义容器模板中的最后一个allocato