为了以后节约时间,记录下模拟报文的实现

模拟报文思路:就是后台把接口数据先写在文档里面写死,接口地址不变,在每个接口里面控制是访问的模拟报文还是数据库里面的数据,

对于前端来说所有都是不变的,就是说我们如果把一个接口从模拟报文数据切换到数据库相关的数据,对于前端来说没有任何的影响

基于的技术平台: spring boot1.5.3 + maven + jdk1.8_112 (不过我觉得没什么关系)

1.写一个模拟报文处理的类Message,也可以写完后封装成jar包后面方便用

public class Message {

  private final Logger logger = Logger.getLogger(getClass());

  public String sendMessage(HttpServletRequest request, Object inputContent){

  //得到URI
  String uri = request.getRequestURI();

  //获取request的json数据,取出所有的键
  String requestContent = JSON.toJSONString(inputContent);
  JSONObject jsonObject = JSON.parseObject(requestContent);
  Set set = jsonObject.keySet();
  //读取事先写在request的txt内容
  String fileRequestPath = "message" + uri +".json";

  String fileContent="";
  try{
  File file = new File(fileRequestPath);
  fileContent=txt2String(file);
  }catch (Exception e){
  return "请求接口地址错误或文件内部数据不是json";
}
  logger.info(fileContent);
  //获取txt的json数据,取出所有的键
  JSONObject jsonFile = JSON.parseObject(fileContent);
  Set setFile = jsonFile.keySet();

  //比较输入的键是不是合乎规范
  boolean check = isSetEqual(set,setFile);
  if(check){
  //如果输入的格式和字段都正确,返回写好的txt报文json格式数据
  String fileResponsePath = "message" + uri +"Response"+".json";
  String rightFile = "";
  try{
  File fileResponse = new File(fileResponsePath);
  rightFile=txt2String(fileResponse);
  }catch (Exception e){
  return "响应报文地址错误或文件内部数据不是json";
}
  JSONObject rightResponse = JSON.parseObject(rightFile);
  return rightResponse.toString();
}else {
  //如果输入的格式或字段不正确,返回写好的错误数据
  String fileResponsePath = "message/error/requestError.json";
  String errorFile = "";
  try{
  File fileResponse = new File(fileResponsePath);
  errorFile=txt2String(fileResponse);
}catch (Exception e){
  return "响应报文地址错误或文件内部数据不是json";
}
  JSONObject errorResponse = JSON.parseObject(errorFile);
  return errorResponse.toString();
}
}

  //读取txt文件的内容,输出String格式
  public String txt2String(File file){
    StringBuilder result = new StringBuilder();
    try{
    BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件
    String s = null;
    while((s = br.readLine())!=null){//使用readLine方法,一次读一行
    result.append(System.lineSeparator()+s);
}
  br.close();
}catch(Exception e){
  e.printStackTrace();
}
  return result.toString();
}

//获取request请求的内容
public String readRequestBody(HttpServletRequest request){
  InputStream inputStream = null;
  BufferedInputStream buf = null;
  StringBuffer requestJsonBuffer = null;
try {
  inputStream = request.getInputStream();
  buf = new BufferedInputStream(inputStream);
  byte[] buffer = new byte[1024];
  requestJsonBuffer = new StringBuffer();
  int a = 0;
  while ((a = buf.read(buffer)) != -1){
  requestJsonBuffer.append(new String(buffer, 0, a, "UTF-8"));
  }
} catch (Exception e) {
  e.printStackTrace();
}finally{
  //关闭连接
  if (null != buf){
  try {
  buf.close();
} catch (IOException e) {
  e.printStackTrace();
  }
}
if (null != inputStream){
  try {
    inputStream.close();
} catch (IOException e) {
  e.printStackTrace();
}
}

}
  return null == requestJsonBuffer ? null : requestJsonBuffer.toString();
}

  //用来比较两个Set是否相等,用来比较request内容的键是不是一样的
  public boolean isSetEqual(Set set1, Set set2) {

  if (set1 == null && set2 == null) {
  return true; // Both are null
}

  if (set1 == null || set2 == null || set1.size() != set2.size()
  || set1.size() == 0 || set2.size() == 0) {
  return false;
}

  Iterator ite2 = set2.iterator();
  boolean isFullEqual = true;

  while (ite2.hasNext()) {
  if (!set1.contains(ite2.next())) {
  isFullEqual = false;
  }
}

  return isFullEqual;
  }

}

Meaasge类的原理:写一个request相关的文档,一个response相关的文档,调用接口的时候拿请求的数据和request里面的数据进行比较,如果参数都对,

我们就返回response中的内容,如果参数有问题,我们就返回特地的错误信息

2.在跟目录下新建message目录,message目录下新建test和error文件,两个文件夹下面再建具体的request和response的json文件

(目录和文件名字可以自己定,不过要跟message中对应好)

3.在具体的接口中使用模拟报文

在类的前面声明

@Autowired
   private HttpServletRequest request;

然后在接口中写:

一句话调用Message类的sendMessage函数就可以实现模拟报文了,后面我们要改过来改下return就可以了,对于前端来说是感觉不到任何改变的,可以加快项目的开发

java模拟报文的更多相关文章

  1. java模拟post请求发送json

    java模拟post请求发送json,用两种方式实现,第一种是HttpURLConnection发送post请求,第二种是使用httpclient模拟post请求, 方法一: package main ...

  2. java 模拟qq源码

    java 模拟qq源码: http://files.cnblogs.com/files/hujunzheng/QQ--hjzgg.zip

  3. java模拟开锁

    java模拟开锁 service qq:928900200 Introduction to Computer Science II: CSCI142Fall 2014Lab #1Instructor: ...

  4. Jsoup实现java模拟登陆

    Jsoup实现java模拟登陆 2013-10-29 14:52:05|  分类: web开发|举报|字号 订阅     下载LOFTER我的照片书  |     1:如何获取cookies. 1.1 ...

  5. [Java] 模拟HTTP的Get和Post请求

    在之前,写了篇Java模拟HTTP的Get和Post请求的文章,这篇文章起源与和一个朋友砍飞信诈骗网站的问题,于是动用了Apache的comments-net包,也实现了get和post的http请求 ...

  6. Java模拟登录系统抓取内容【转载】

    没有看考勤的习惯,导致我的一天班白上了,都是钱啊,系统也不发个邮件通知下....     为了避免以后还有类似状况特别写了个java模拟登录抓取考勤内容的方法(部分代码来自网络),希望有人修改后也可以 ...

  7. Java模拟登陆02【转载】

    在使用java访问URL时,如果该URL需要身份验证,那么就不能够直接访问,因为没有登陆.那么,如何解决这个问题呢?     方法是使用java模拟登陆,登陆后记录下cookie信息,在下次发起请求时 ...

  8. java socket报文通信(一)socket的建立

    java socket报文通信(一) socket的建立  今天来和大家分享一下java中如何使用socket进行通信.先来啰嗦两句,看看Tcp/ip和udp: TCP是Transfer Contro ...

  9. java模拟浏览器包selenium整合了htmlunit,火狐浏览器,IE浏览器,opare浏览器驱

    //如果网页源码中有些内容是js渲染过来的,那你通过HttpClient直接取肯定取不到,但是这些数据一般都是通过异步请求传过来的(一般都是通过ajax的get或者post方式).那么你可以通过火狐浏 ...

随机推荐

  1. VS2015下OpenGL库的配置

    写在前面: 最近要用到OpenGL,光是在VS2015下配置就费了很大的劲,现在将我的成果直接贡献给大家,希望能为需要在VS2015下配置OpenGL的读者省去一些麻烦. 正文: 资源地址1:http ...

  2. vue2.0版cnode社区项目搭建及实战开发

    _________________________________________________________________________ 初涉vue就深深的被vue强大的功能,快速的开发能力 ...

  3. 如何有效快速提高Java服务端开发人员的技术水平?

    我相信很多工作了3-5年的开发人员都会经常问自己几个问题: 1.为什么总是感觉技术没有质的提高? 2.如何能够有效和快速的提高自身的技术水平? 3.如何进入到一个牛逼的大公司,认识牛逼的人? 这篇文章 ...

  4. 安装php提示 configure: error: Cannot find OpenSSL's libraries 解决方案

    一次在安装php7其中提示错误信息 configure: error: Cannot find OpenSSL's libraries 出现这种有2中情况,一种是没有安装 openssl,另一种是安装 ...

  5. Fullcalendar 日历控件的基本使用

    1:Fullcalendar 日历控件的基本简介 Fullcalendar是一款十分强大的开源日历免费控件,提供了丰富的属性设置和方法调用. 官网地址:https://fullcalendar.io/ ...

  6. PTA自测-3 数组元素循环右移问题

    自测-3 数组元素循环右移问题  一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M≥0)个位置,即将A中的数据由(A0A1···A​N-1​​)变换为 ...

  7. bzoj4031 [HEOI2015]小Z的房间

    Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着. ...

  8. (原创)看我用各种姿势在手机和PC查看到连接到的wifi密码

    今天一个女神来我家做客,她问我WiFi密码,然而我却奇迹般的忘记了(特么的当时心里一万个草泥马踏过去),让我在她面前尴尬求子的,所以为了防止你们也出现这种情况,我特地把各种方法整理了一下,那么感兴趣的 ...

  9. openfire+smack 实现即时通讯基本框架

    smack jar下载地址 http://www.igniterealtime.org/downloads/download-landing.jsp?file=smack/smack_3_2_2.zi ...

  10. iOS APP打包分发给远程的手机测试

    APP要打包给远程的朋友或客户测试,但又不是企业账号的情况下,我们只能根据手机的udid进行描述证书的配置,再打包分发给提供了udid的手机进行安装 一.如何得到udid? 手机连接到mac电脑,打开 ...