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的更多相关文章

  1. 接口测试“八重天”---RestAssured

    要记住每一个对你好的人,因为他们本可以不那么做. ---久节奏,慢读书 一.什么是RestAssured 偶然在逛帖子的时候发现一个接口测试框架,觉得不错,学习学习. 官方地址:http://rest ...

  2. 【接口测试】使用httpClient获取cookies+携带获取的cookies访问get接口

    数据准备 在本机或者远端机器安装部署moco-runner(参考:https://blog.csdn.net/qq_32706349/article/details/80472445) 这里我们只需要 ...

  3. url post 请求方法

    最近的项目是给手机app 提供方法. 因此 此方法可以进行接口测试 static class HttpClient { static CookieContainer cookies = new Coo ...

  4. HttpClient在HTTP协议接口测试中的使用

    TTP协议的接口测试中,使用到最多的就是GET请求与POST请求,其中POST请求有FORM参数提交请求与RAW请求,下面我将结合HttpClient来实现一下这三种形式: 一.GET请求: GET请 ...

  5. 接口测试(二)—HttpClient

    使用HttpClient进行接口测试,所需要使用的相关代码 HttpClient进行接口测试所需jar包:httpclient.jar.httpcore.jar.commons-logging.jar ...

  6. 接口测试入门(3)--使用httpClient进行登录用例操作/set-cookies验证/ List<NameValuePair>设置post参数/json解析

    (最近学的都是很基础的接口测试,都是基于UI界面可见的接口,就是发请求,接收响应,分析返回的结果,校验,对共通模块进行封装,仅此而已,其实做自动化的思路基本都是如此,UI也是.) 现在开始用httpC ...

  7. 接口测试——HttpClient工具的https请求、代理设置、请求头设置、获取状态码和响应头

    目录 https请求 代理设置 请求头设置 获取状态码 接收响应头 https请求 https协议(Secure Hypertext Transfer Protocol) : 安全超文本传输协议, H ...

  8. 接口自动化:HttpClient + TestNG + Java(二) - 第一个接口测试:get请求

    在上一篇中,我们搭建好了HttpClient + TestNG + Java的自动化接口测试环境,这一篇我们就赶紧开始编写我们的第一个接口测试用例. 本篇会对问题解决的思路进行更详尽的阐述. 2.1 ...

  9. 接口自动化:HttpClient + TestNG + Java(一) - 接口测试概述+自动化环境搭建

    1.1 接口测试简介 1.1.1 什么是接口测试 开始学习接口自动化测试之前,我们先要来了解什么是接口,以及什么是接口测试. 我们都知道,测试从级别上划分可以分为 组件测试 集成测试 系统测试 验收测 ...

随机推荐

  1. 初始化 Flask 虚拟环境 命令

    参考:<Flask Web开发> 系统:Mac OSX CMD // 激活环境 virtualenv venv source venv/bin/activate // 安装flask pi ...

  2. 将日期转换为指定的格式:比如转换成 年月日时分秒 这种格式:yyyy-MM-dd hh:mm:ss 或者 yyyy-MM-dd。总结下。

    可以为Date原型添加如下的方法: Date.prototype.format = function(fmt) { var o = { "M+" : this.getMonth() ...

  3. Combobox绑定泛型字典时提示“复杂的 DataBinding 接受 IList 或 IListSource 作为数据源”的解决方法

    一般情况下我们会将 DataTable 或 DataView 绑定到 Combobox 控件上,这时候进行数据绑定是没有问题的,因为DataTable 和 DataView 都继承了 IList 接口 ...

  4. Nginx 正则匹配

    目录 Nginx 正则表达式之匹配操作符 过期缓存 针对浏览器 针对文件类型 针对文件夹 判断文件,文件夹 设置某些类型文件的浏览器缓存时间 匹配到所有uri 全局变量 常用正则 Nginx 正则表达 ...

  5. vSphere Client的拷贝 粘帖 功能

    Windows Client OS的情况下, Remote Desktop 自带拷贝/粘帖 功能, 所以一直没在意. 这回用CentOS, 比起vnc viewer , 感觉还是自带的 vSphere ...

  6. HDU1166 敌兵布阵_线段树

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  7. PHP:第五章——字符串输出函数

    <?php header("Content-Type:text/html;charset=utf-8"); /*字符串输出函数*/ //1.echo 输出一个或多个字符 // ...

  8. jsp登录页面,展示错误信息,刷新页面后错误依然存在解决方案

    在做登录页面的时候,通常使用form表单同步提交的方法进行提交的,也就是在form表单里去写action,如果登录失败,jsp通过jstl表达式获取错误信息展示在页面上,但是有一个问题就是,即使你刷新 ...

  9. mysql "Your password has expired...."错误解决方案

    mysql -u root -p 进入mysql命令界面,然后输入 set password = password("新密码"); 参考:http://blog.csdn.net/ ...

  10. MySQL数据引擎InnoDB和MyISAM互相转换

    MySQL(或者社区开源fork的MariaDB)5.5以上支持InnoDB引擎,并将其作为默认数据库引擎.InnoDB带来很多改进,但是对系统资源占用明显增加,对于还在128MB-512MB内存VP ...