接口测试“八重天”---HttpClient
HTTP协议在互联网无处不在,在前面的章节中记录了‘接口本质即协议’,因此,接口测试首先了解的便是协议,其发送数据包和接收数据包的过程,其次便是如何在测试中去发送去解析,不论是通过代码还是工具也好,抽空学习一下HttpClient。
HttpClient基本概念
(官方地址:http://hc.apache.org/httpclient-3.x/)
HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。(百度百科)
HttpClient于2001年作为Jakarta Commons的子项目启动,基于Jakarta Slide项目开发的代码 。它于2004年从下议院晋升,毕业于另一个雅加达项目。2005年,雅加达的HttpComponents项目被创建,其任务是开发HttpClient 3.x的后继产品,并维护现有的代码库,直到新的代码库准备好接管。该共享项目,摇篮HttpClient的,离开雅加达 ,2007年成为一个独立的顶级项目。同年晚些时候, HttpComponents 项目还让雅加达成为一个独立的顶级项目,负责维护HttpClient。
它的一个基本特征还是有必要去了解的:
- 基于标准的纯Java,HTTP版本1.0和1.1的实现
- 在可扩展的OO框架中完全实现所有HTTP方法(GET,POST,PUT,DELETE,HEAD,OPTIONS和TRACE)。
- 支持使用HTTPS(HTTP over SSL)协议进行加密。
- 精细的非标准配置和跟踪。
- 通过HTTP代理进行透明连接。
- 通过HTTP代理通过CONNECT方法进行隧道连接。
- 使用本机Java套接字支持通过SOCKS代理(版本4和5)进行透明连接。
- 使用Basic,Digest和加密NTLM(NT Lan Manager)方法进行身份验证。
- 用于自定义身份验证方法的插件机制。
- 用于上载大文件的多部分表单POST。
- 可插拔的安全套接字实现,使其更易于使用第三方解决方案
- 连接管理支持在多线程应用程序中使用。支持设置最大总连接数以及每个主机的最大连接数。检测并关闭陈旧连接。
- 用于读取Set-Cookie的自动Cookie处理:来自服务器的标头,并在适当时将其发送回Cookie:标头。
- 用于自定义cookie策略的插件机制。
- 请求输出流以避免通过直接流式传输到服务器的套接字来缓冲任何内容主体。
- 响应输入流通过直接从套接字流式传输到服务器来有效地读取响应主体。
- 使用HTTP / 1.0中的KeepAlive和HTTP / 1.1中的持久连接的持久连接
- 直接访问服务器发送的响应代码和标头。
- 设置连接超时的能力。
- HttpMethods实现命令模式以允许并行请求和连接的有效重用。
- 源代码可在Apache软件许可下免费获得。
百度百科上有其详细的执行步骤:
1、创建Httpclient实例;
2、创建某种连接方法的实例,在这里是GetMethod。在 GetMethod 的构造函数中传入待连接的地址;
3、调用第一步中创建好的实例的 execute 方法来执行第二步中创建好的 method 实例;
4、读 response;
5、释放连接。无论执行方法是否成功,都必须释放连接;
6、对得到后的内容进行处理。
官方教程:
1、实例化Httpclient
- HttpClient client = new HttpClient();
2、创建方法
- HttpMethod method = new GetMethod("http://www.apache.org/");
3、执行方法
- // set per default
- client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
- new DefaultHttpMethodRetryHandler());
4、读取response
- byte [] responseBody = method.getResponseBody();
5、释放连接
- method.releaseConnection();
6、处理返回数据
- System.out.println(new String(responseBody));
最终实例
- import org.apache.commons.httpclient.*;
- import org.apache.commons.httpclient.methods.*;
- import org.apache.commons.httpclient.params.HttpMethodParams;
- import java.io.*;
- public class HttpClientTutorial {
- private static String url = "http://www.apache.org/";
- public static void main(String[] args) {
- // Create an instance of HttpClient.
- HttpClient client = new HttpClient();
- // Create a method instance.
- GetMethod method = new GetMethod(url);
- // Provide custom retry handler is necessary
- method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
- new DefaultHttpMethodRetryHandler(3, false));
- try {
- // Execute the method.
- int statusCode = client.executeMethod(method);
- if (statusCode != HttpStatus.SC_OK) {
- System.err.println("Method failed: " + method.getStatusLine());
- }
- // Read the response body.
- byte[] responseBody = method.getResponseBody();
- // Deal with the response.
- // Use caution: ensure correct character encoding and is not binary data
- System.out.println(new String(responseBody));
- } catch (HttpException e) {
- System.err.println("Fatal protocol violation: " + e.getMessage());
- e.printStackTrace();
- } catch (IOException e) {
- System.err.println("Fatal transport error: " + e.getMessage());
- e.printStackTrace();
- } finally {
- // Release the connection.
- method.releaseConnection();
- }
- }
- }
该例使用的是Get方法,那么我们日常中使用的方法最多的无外乎Get和Post方法,那么就找一下这两个方法的例子。
实例
该实例取自:https://www.cnblogs.com/sharpest/p/7831350.html。
- /**
- * @author Richered
- * HttpClientGET
- */
- package com.me.learn;
- import java.io.IOException;
- import org.apache.http.HttpEntity;
- import org.apache.http.client.ClientProtocolException;
- import org.apache.http.client.methods.CloseableHttpResponse;
- import org.apache.http.client.methods.HttpGet;
- import org.apache.http.impl.client.CloseableHttpClient;
- import org.apache.http.impl.client.HttpClientBuilder;
- import org.apache.http.util.EntityUtils;
- public class HttpClientGET {
- public static void main(String []args) {
- //创建httpclient对象
- CloseableHttpClient httpClient = HttpClientBuilder.create().build();
- //创建httpclientget方法对象
- HttpGet httpGet = new HttpGet("https://www.baidu.com");
- CloseableHttpResponse response = null;
- try {
- // 3. 执行GET请求
- response = httpClient.execute(httpGet);
- System.out.println(response.getStatusLine());
- // 4. 获取响应实体
- HttpEntity entity = response.getEntity();
- // 5. 处理响应实体
- if (entity != null) {
- System.out.println("长度:" + entity.getContentLength());
- System.out.println("内容:" + EntityUtils.toString(entity));
- }
- } catch (ClientProtocolException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- // 6. 释放资源
- try {
- response.close();
- httpClient.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
- /**
- * @author Richered
- * HttpClientPOST
- */
- package com.me.learn;
- import java.io.IOException;
- import java.io.UnsupportedEncodingException;
- import java.util.ArrayList;
- import java.util.List;
- import org.apache.http.HttpEntity;
- import org.apache.http.NameValuePair;
- import org.apache.http.client.ClientProtocolException;
- import org.apache.http.client.entity.UrlEncodedFormEntity;
- import org.apache.http.client.methods.CloseableHttpResponse;
- import org.apache.http.client.methods.HttpPost;
- import org.apache.http.impl.client.CloseableHttpClient;
- import org.apache.http.impl.client.HttpClientBuilder;
- import org.apache.http.message.BasicNameValuePair;
- import org.apache.http.util.EntityUtils;
- public class HttpClientPOST {
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- // 1. 创建HttpClient对象
- CloseableHttpClient httpClient = HttpClientBuilder.create().build();
- // 2. 创建HttpPost对象
- HttpPost post = new HttpPost(
- "https://www.baidu.com");
- // 3. 设置POST请求传递参数
- List<NameValuePair> params = new ArrayList<NameValuePair>();
- params.add(new BasicNameValuePair("username", "test"));
- params.add(new BasicNameValuePair("password", "12356"));
- try {
- UrlEncodedFormEntity entity = new UrlEncodedFormEntity(params);
- post.setEntity(entity);
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- }
- // 4. 执行请求并处理响应
- try {
- CloseableHttpResponse response = httpClient.execute(post);
- HttpEntity entity = response.getEntity();
- if (entity != null){
- System.out.println("响应内容:");
- System.out.println(EntityUtils.toString(entity));
- }
- response.close();
- } catch (ClientProtocolException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- // 释放资源
- try {
- httpClient.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- }
接口测试“八重天”---HttpClient的更多相关文章
- 接口测试“八重天”---RestAssured
要记住每一个对你好的人,因为他们本可以不那么做. ---久节奏,慢读书 一.什么是RestAssured 偶然在逛帖子的时候发现一个接口测试框架,觉得不错,学习学习. 官方地址:http://rest ...
- 【接口测试】使用httpClient获取cookies+携带获取的cookies访问get接口
数据准备 在本机或者远端机器安装部署moco-runner(参考:https://blog.csdn.net/qq_32706349/article/details/80472445) 这里我们只需要 ...
- url post 请求方法
最近的项目是给手机app 提供方法. 因此 此方法可以进行接口测试 static class HttpClient { static CookieContainer cookies = new Coo ...
- HttpClient在HTTP协议接口测试中的使用
TTP协议的接口测试中,使用到最多的就是GET请求与POST请求,其中POST请求有FORM参数提交请求与RAW请求,下面我将结合HttpClient来实现一下这三种形式: 一.GET请求: GET请 ...
- 接口测试(二)—HttpClient
使用HttpClient进行接口测试,所需要使用的相关代码 HttpClient进行接口测试所需jar包:httpclient.jar.httpcore.jar.commons-logging.jar ...
- 接口测试入门(3)--使用httpClient进行登录用例操作/set-cookies验证/ List<NameValuePair>设置post参数/json解析
(最近学的都是很基础的接口测试,都是基于UI界面可见的接口,就是发请求,接收响应,分析返回的结果,校验,对共通模块进行封装,仅此而已,其实做自动化的思路基本都是如此,UI也是.) 现在开始用httpC ...
- 接口测试——HttpClient工具的https请求、代理设置、请求头设置、获取状态码和响应头
目录 https请求 代理设置 请求头设置 获取状态码 接收响应头 https请求 https协议(Secure Hypertext Transfer Protocol) : 安全超文本传输协议, H ...
- 接口自动化:HttpClient + TestNG + Java(二) - 第一个接口测试:get请求
在上一篇中,我们搭建好了HttpClient + TestNG + Java的自动化接口测试环境,这一篇我们就赶紧开始编写我们的第一个接口测试用例. 本篇会对问题解决的思路进行更详尽的阐述. 2.1 ...
- 接口自动化:HttpClient + TestNG + Java(一) - 接口测试概述+自动化环境搭建
1.1 接口测试简介 1.1.1 什么是接口测试 开始学习接口自动化测试之前,我们先要来了解什么是接口,以及什么是接口测试. 我们都知道,测试从级别上划分可以分为 组件测试 集成测试 系统测试 验收测 ...
随机推荐
- CCNA学习指南 -开放最短路径优先OSPF(单区域)
在上个世纪九十年代撰写的<TCP/IP协议详解 卷一:协议>的动态选路中,内容大部分还是介绍 RIP路由选择信息协议,在互联网络如此发达的今天,RIP因为它的局限性逐步被OSPF取代. 在 ...
- scrapy中的canonicalize_url【转】
转自:http://www.leyle.com/archives/canonicalize_url.html 思考一下:对url进行规范化处理是否是必须的?因为这一步处理涉及到编码转换,对于一个网页的 ...
- POJ 2288 Islands and Bridges(状压dp)
http://poj.org/problem?id=2288 题意: 有n个岛屿,每个岛屿有一个权值V,一条哈密顿路径C1,C2,...Cn的值为3部分之和: 第1部分,将路径中每个岛屿的权值累加起来 ...
- python 列表嵌套
>>> a = ['a', 'b', 'c'] >>> n = [, , ] >>> x = [a, n] >>> x [[, ...
- LINUX创建管道文件
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- 使用QQ邮箱SMTP服务的javamail配置
最近做一个小项目要用到JAVA的邮箱的发送功能.遇到一些坑这里记录分享一下:QQ群交流:697028234 1.QQ邮箱一定要设置开通SMTP/POP这项.并生成授权码. 2.用MAVEN生成一个QU ...
- Python3 条件控制(九)
Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. 可以通过下图来简单了解条件语句的执行过程: if 语句 Python中if语句的一般形式如下所示: i ...
- U盘安装linix
首先制作u盘启动器. 然后在电脑上使用UltraISO将你的安装的linix系统刻录到u盘上 在放入一份linix系统在u盘更目录 boot页面u盘启动.选择 第二次没有放入系统在u盘根目录出现这个: ...
- 爱奇艺、腾讯、优酷、搜狐、芒果、乐视、PPTV、音悦台等VIP视频免费观看
观看地址一:http://www.luoruiyuan.cn/pages/id-62_uid-2_btid-35.html 观看地址二:http://movie.luoruiyuan.cn/vip.h ...
- 关于oceanbase中存储过程的设计与实现
转自http://www.zhujuncoding.com/index.php/Index/blogview?id=82 这篇文章是关于在淘宝的数据库oceanbase中添加存储过程支持的文章,oce ...