test
目前我们遇到的B/S结构的应用程序, HTTP 应该是最为广泛使用的协议了。Java 标准库提供了 一个HttpURLConnection 类来支持 HTTP 通讯,只是功能有限。httpClient是一个实现http协议很多操作功能的组件,并且支持 HTTP 协议最新的版本和建议,像现在Android已经成功的集成了HttpClient。当然还有Square 公司开源的 OkHttp ,据说能提供更高效率的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服务。这里提供一个例子。
使用的步骤一般是:1. 创建HttpClient对象。2. 构造method请求对象。3. 执行HttpClient对象的execute方法。4. 读取execute方法返回的HttpResponse结果并解析。5、释放连接。整个过程是不是与我们平时在浏览器上访问类似呢。唯一区别是不能执行HTTP页面中签入嵌入的JS代码,自然也不会对页面内容进行任何解析、处理。在以上代码中,httpclient的初始化没有看到任何参数设置,其实是在它的构造函数里调用了接口,并设置了默认值,包含协议版本、客户端引擎、cookie策略等,如果要自己设置,可以通过它的成员变量httpClientParams对象进行设置。
1、重定向
http多种状态已经在HttpStatus这个类中定义好,当返回的是301,则表示请求的资源已经被移到一个固定的新地方。302表示暂时的转向,比如在服务器端的servlet程序调用了sendRedirect方法,则在客户端就会得到一个302的代码,这时服务器返回的头信息中location的值就是sendRedirect转向的目标地址。如果是get方式请求,httpclient是自动帮你重定向并拿到响应信息,也可以通过设置method.setFollowRedirects(false)不自动转。
2、编码方式
客户端发送的数据多样,首部字段content-type 说明了实体主体内对象的媒体类型,浏览器在拿到服务器返回的数据后,根据头部设置的可接收媒体类型进行内容协商,返回最适合的资源。对于有中文的请求,为避免出现乱码,最好设置content-type。如果未设置contentType 那么默认会采用ISO-8859-1的方式进行编码。get方式参数若有中文通过URLEncoder.encode(data, "utf-8") 进行处理。
3、cookie处理
httpclient默认的cookie策略是RFC_2109。可以通过client.getParams().setCookiePolicy(CookiePolicy.RFC_2965);其中可以通过去更改。请求过程中可以通过sendHead 把cookie放入头部,并传到后端进行访问。一般后台返回的消息中头部会带有set-cookie 有些是不在头部,所以我这边写了两个方式去拿。
基本上使用httpclient过程中,主要操作的类有:httpclient,getMethod,postMethod,httpClientParams,httpConnectionManager这几个。详见以下的类图。
4、小tips
1、fidder作为一款强大好用的web调试利器,针对commons下的httpclient可以如下设置代理,能帮你记录下请求和响应的所有信息。 接口测试中遇到异常方便查看,减少自己debug的情况。
结束语
httpclient还有其他功能如DNS配置、多线程下的httpclient使用。本篇文件旨在用做一些简单接口的测试以及对http、cookie-session机制有更深刻的认识。目前commons这个版本已经不做更新了,如果有复杂的接口,推荐使用org.apache.http.impl.client下的httpclient 官网 http://hc.apache.org/index.html