使用HttpClient工具类测试Http接口
一、httpClient模拟客户端
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
public class GpoHttpClientServiceImpl {
@DataProvider(name = "datapro")
public Iterator<Object[]> datapro() {
return new ExcelDataProvider("hospitalInv", "invokeGpoHttpServer");
}
@Test(dataProvider = "datapro")
public void invokeGpoHttpServer(Map<String, String> data) throws Exception {
// 创建http post请求
HttpPost httppost = new HttpPost(data.get("httpUrl"));
// 将请求的xml格式的字符串进行压缩
String zipReqxml = ZipUtil.zipBase64String(data.get("reqXml"));
// 将请求的xml业务数据与接口密钥一起使用MD5加密,指定字符集为UTF-8
String sign = MD5Util.sign(data.get("reqXml"), data.get("mscpKey"), "utf-8");
// 将服务端所需要的参数以BasicNameValuePair键值对的方式进行封装,并添加到一个NameValuePair类型的list中,作为传送的容器,list中的每个元素都是一个键值对
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("mscpCode", data.get("mscpCode")));
params.add(new BasicNameValuePair("sign", sign));
params.add(new BasicNameValuePair("reqXml", zipReqxml));
// 设置http请求实体,http接口服务端接收数据的格式为NameValuePair类型的list实体
httppost.setEntity(new UrlEncodedFormEntity(params, "utf-8"));
// 创建http客户端
CloseableHttpClient httpclient = HttpClients.createDefault();
// 发送http post请求
HttpResponse response = httpclient.execute(httppost);
// 获取服务端返回的httpCode
int httpCode = response.getStatusLine().getStatusCode();
// 将服务端返回的结果实体转换成字符串
String result = EntityUtils.toString(response.getEntity());
System.out.println("HttpCode:" + httpCode + " 服务器返回结果:" + result);
}
}
二、MD5接口数据加密
import java.io.UnsupportedEncodingException;
import java.security.SignatureException;
import org.apache.commons.codec.digest.DigestUtils;
public class MD5Util {
/**
* 签名字符串
*
* @param text
* 需要签名的字符串
* @param key
* 密钥
* @param input_charset
* 编码格式
* @return 签名结果
*/
public static String sign(String text, String key, String input_charset) {
text = text + key;
return DigestUtils.md5Hex(getContentBytes(text, input_charset));
}
/**
* @param content
* @param charset
* @return
* @throws SignatureException
* @throws UnsupportedEncodingException
*/
private static byte[] getContentBytes(String content, String charset) {
if (charset == null || "".equals(charset)) {
return content.getBytes();
}
try {
return content.getBytes(charset);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + charset);
}
}
}
三、对传输的数据进行压缩
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
import org.apache.commons.codec.binary.Base64;
public class ZipUtil {
/**
* 使用zip进行压缩
*
* @param str
* 压缩前的文本
* @return 返回压缩后的文本
*/
public static final String zipBase64String(String str) {
if (str == null)
return null;
byte[] compressed;
ByteArrayOutputStream out = null;
ZipOutputStream zout = null;
String compressedStr = null;
try {
out = new ByteArrayOutputStream();
zout = new ZipOutputStream(out);
zout.putNextEntry(new ZipEntry("zip"));
zout.write(str.getBytes("utf-8"));
zout.closeEntry();
compressed = out.toByteArray();
compressedStr = Base64.encodeBase64String(compressed);
} catch (IOException e) {
e.printStackTrace();
compressed = null;
} finally {
if (zout != null) {
try {
zout.close();
} catch (IOException e) {
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
}
}
}
return compressedStr;
}
/**
* 使用zip进行解压缩
*
* @param compressed
* Base64转码的压缩文本
* @return 解压后的字符串
*/
public static String unzipBase642String(String base64CompressedStr) {
if (base64CompressedStr == null) {
return null;
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
ByteArrayInputStream in = null;
ZipInputStream ginzip = null;
String decompressed = null;
try {
byte[] compressed = Base64.decodeBase64(base64CompressedStr);
in = new ByteArrayInputStream(compressed);
ginzip = new ZipInputStream(in);
ginzip.getNextEntry();
byte[] buffer = new byte[1024];
int offset = -1;
while ((offset = ginzip.read(buffer)) != -1) {
out.write(buffer, 0, offset);
}
decompressed = out.toString("utf-8");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
}
}
if (ginzip != null) {
try {
ginzip.close();
} catch (IOException e) {
}
}
if (in != null) {
try {
in.close();
} catch (IOException e) {
}
}
}
return decompressed;
}
}
使用HttpClient工具类测试Http接口的更多相关文章
- 使用HttpClient工具类测试WebService接口(soap)
import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;import jav ...
- 通过Httpclient工具类,实现接口请求
package luckyweb.seagull.util; import org.apache.http.NameValuePair; import org.apache.http.client.e ...
- Java开发小技巧(五):HttpClient工具类
前言 大多数Java应用程序都会通过HTTP协议来调用接口访问各种网络资源,JDK也提供了相应的HTTP工具包,但是使用起来不够方便灵活,所以我们可以利用Apache的HttpClient来封装一个具 ...
- 基于HttpClient4.5.2实现的HttpClient工具类
1.maven依赖: <dependency> <groupId>org.apache.commons</groupId> <artifactId>co ...
- 转:轻松把玩HttpClient之封装HttpClient工具类(一)(现有网上分享中的最强大的工具类)
搜了一下网络上别人封装的HttpClient,大部分特别简单,有一些看起来比较高级,但是用起来都不怎么好用.调用关系不清楚,结构有点混乱.所以也就萌生了自己封装HttpClient工具类的想法.要做就 ...
- mybatis的基本配置:实体类、配置文件、映射文件、工具类 、mapper接口
搭建项目 一:lib(关于框架的jar包和数据库驱动的jar包) 1,第一步:先把mybatis的核心类库放进lib里
- 使用单例模式实现自己的HttpClient工具类
引子 在Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient 来方便我们使用各种Http服务.你可以把HttpCli ...
- Android开发实现HttpClient工具类
在Android开发中我们经常会用到网络连接功能与服务器进行数据的交互,为此Android的SDK提供了Apache的HttpClient来方便我们使用各种Http服务.你可以把HttpClient想 ...
- 【SoapUI、Postman、WebServiceStudio、Jmeter】接口测试工具结合测试webservice接口(发送XML格式参数)
目录: SoapUI测试webservice接口,发送XML格式参数 Postman测试webservice接口,发送XML格式参数 WebServiceStudio.exe测试webservice接 ...
随机推荐
- MySql 安装过程(摘自网络)
下面的是MySQL安装的图解,用的可执行文件安装的,详细说明了一下! 打开下载的mysql安装文件mysql-5.0.27-win32.zip,双击解压缩, 运行“setup.exe”,出现如下界面 ...
- php函数搜集
数组去重: 方法1:php自带此功能的函数array_unique($arr) 方法2:$arr = array_flip(array_flip($arr)); //这样便可以删除重复元素. 比上面的 ...
- 线性规划?数学?差分约束?Good Bye 2016 C
http://codeforces.com/contest/750/problem/C 反正我不会这道题...为什么那么多人做出来了...我好菜.jpg 题目大意:cf每个人都有分数,每次都会在div ...
- underScore学习1:匿名函数中call(this)的作用
匿名函数中(function(){}).call(this) 中的.call(this) 有什么用? 我们都知道,.call()可以改变函数执行时的context,即this的指向,源码中的.call ...
- ASCII码对应表chr(num)
chr(9) tab空格 chr(10) 换行 chr(13) 回车 Chr(13)&chr(10) 回车换行 chr(32) 空格符 ...
- 五、oracle基本建表语句
--创建用户create user han identified by han default tablespaceusers Temporary TABLESPACE Temp;grant conn ...
- Angularjs directive全面解读(1.4.5)
说到Angularjs directive即指令,可以这么说Angularjs的灵魂就是指令,学会Angularjs指令那么你的Angularjs的武功就修炼了一半了,当然这只是鄙人的一点点独到见解, ...
- Winform 无边框窗口移动自定义边框粗细颜色
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- ORACEL12c求和SUM(a+b)与SUM(a)+SUM(b)结果不一致问题
今天在oracle12c数据库遇到的问题,下面重现一下: 1.先创建一个临时表 temp.一个数据表bitest_sum; -- Create table create table PEC.BITES ...
- java变量初始化
java全局变量会自动初始化,但局部变量不会自动初始化.当我们新建一个对象的时候,java会申请一个区域存放类的数据,而成员变量就是类的数据,也是放在这个内存区域中,jvm申请内存时初始化.而方法中变 ...