使用stub进行快速迭代开发

简介:

现在趋向于前台和后台分层开发

前端调用后台接口获取数据,然后在页面展示.

但是有时候前台(静态资源)和后台联调时很麻烦:

(1)后台依赖协作方,里面的内容很难遍历各种情况;

(2)后台的数据修改起来很麻烦,因为我们没法直接修改数据库,因为数据库在协作方那里.

 

所以我想到了一个解决方法:stub

stub,说白了,就是造假数据

 当然假数据符合协作方的API文档规范
 因为通常情况下,需求出来后,协作方接口正在开发, 但是我们应用需要调用协作方接口进行开发
 但是总不能等着他们开发完成吧
 所以让他们先出API文档,然后我们根据API文档搞假数据来开发

先看下我是如何操作的.

我使用JMeter进行接口测试

 执行结果如下:

 

但是,你们知道返回的数据来自哪里吗?

来自于如下文件:

 orderContent.json的内容就是返回结果:

 

所以你想要返回什么内容,就可以直接修改对应的.json 文件.

 

规范:

比如你访问路径:/tv_mobile/stub/appstore/orderContent

那么stub目录下面一定有一个文件夹叫appstore,appstore 下面一定有一个文件orderContent.json

再比如你访问路径:/tv_mobile/stub/orgList

那么stub目录下面一定有一个文件叫orgList.json

 

项目使用spring MVC 框架

核心控制器:

Java代码   收藏代码
  1. package com.web.controller.comm;  
  2.   
  3. import java.io.FileInputStream;  
  4. import java.io.IOException;  
  5.   
  6. import javax.servlet.http.HttpServletRequest;  
  7.   
  8. import org.apache.log4j.Logger;  
  9. import org.springframework.stereotype.Controller;  
  10. import org.springframework.web.bind.annotation.PathVariable;  
  11. import org.springframework.web.bind.annotation.RequestMapping;  
  12. import org.springframework.web.bind.annotation.ResponseBody;  
  13.   
  14. import com.common.util.SystemHWUtil;  
  15. import com.common.util.WebServletUtil;  
  16. import com.io.hw.file.util.FileUtils;  
  17. import com.util.JSONPUtil;  
  18.   
  19. /*** 
  20.  * 用于stub 
  21.  *  
  22.  * @author huangweii 2015年5月29日 
  23.  */  
  24. @Controller  
  25. @RequestMapping("/stub")  
  26. public class StubController {  
  27.     protected Logger logger = Logger.getLogger(this.getClass());  
  28.     public static final String stub_folder = "stub/";  
  29.     public static final String stub_file_Suffix = ".json";  
  30.   
  31.     /*** 
  32.      *  
  33.      * @param request 
  34.      * @param action 
  35.      * @param callback 
  36.      * @return 
  37.      */  
  38.     @ResponseBody  
  39.     @RequestMapping(value = "/{action}", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF)  
  40.     public String corsJsonSimple(HttpServletRequest request,  
  41.             @PathVariable String action, String callback) {  
  42.         String content = null;  
  43.         content = stub(request, stub_folder + action + stub_file_Suffix);  
  44.         return JSONPUtil.getJsonP(content, callback);  
  45.     }  
  46.   
  47.     /*** 
  48.      *  
  49.      * @param request 
  50.      * @param namespace 
  51.      * @param action 
  52.      * @param callback 
  53.      * @return 
  54.      */  
  55.     @ResponseBody  
  56.     @RequestMapping(value = "/{namespace}/{action}", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF)  
  57.     public String corsJsonSimple(HttpServletRequest request,  
  58.             @PathVariable String namespace, @PathVariable String action,  
  59.             String callback) {  
  60.         String content = null;  
  61.         content = stub(request, stub_folder + namespace + "/" + action  
  62.                 + stub_file_Suffix);  
  63.         return JSONPUtil.getJsonP(content, callback);  
  64.     }  
  65.     private String stub(HttpServletRequest request, String path) {  
  66.         return stub(request, path, SystemHWUtil.CURR_ENCODING);  
  67.     }  
  68.     /*** 
  69.      * 读取文件 
  70.      * @param request 
  71.      * @param path 
  72.      * @param charset 
  73.      * @return 
  74.      */  
  75.     private String stub(HttpServletRequest request, String path,String charset) {  
  76.         String content = null;  
  77.         try {  
  78.             String realPath2 = WebServletUtil.getRealPath(request, path);  
  79.             java.io.InputStream input = new FileInputStream(realPath2);  
  80.             content = FileUtils.getFullContent2(input,charset);  
  81.         } catch (java.io.FileNotFoundException ex) {  
  82.             ex.printStackTrace();  
  83.         } catch (IOException e) {  
  84.             e.printStackTrace();  
  85.         }  
  86.         return content;  
  87.     }  
  88.   
  89. }  

 

核心方法:

Java代码   收藏代码
  1. /** 
  2.      * 获取相对地址的绝对地址 
  3.      *  
  4.      * @param request 
  5.      * @param relativePath 
  6.      * @return 
  7.      */  
  8.     public static String getRealPath(HttpServletRequest request, String relativePath) {  
  9.         return request.getSession().getServletContext().getRealPath(relativePath);  
  10.     }  

 

 --------控制器更新了 2016-01-24--------

Java代码   收藏代码
  1. package oa.web.controller.common;  
  2.   
  3. import com.common.util.SystemHWUtil;  
  4. import com.common.util.WebServletUtil;  
  5. import com.io.hw.file.util.FileUtils;  
  6. import com.io.hw.json.HWJacksonUtils;  
  7. import com.string.widget.util.ValueWidget;  
  8. import org.apache.log4j.Logger;  
  9. import org.springframework.stereotype.Controller;  
  10. import org.springframework.web.bind.annotation.PathVariable;  
  11. import org.springframework.web.bind.annotation.RequestMapping;  
  12. import org.springframework.web.bind.annotation.ResponseBody;  
  13.   
  14. import javax.servlet.http.HttpServletRequest;  
  15. import java.io.FileInputStream;  
  16. import java.io.IOException;  
  17.   
  18. /*** 
  19.  * 用于stub 
  20.  * 
  21.  * @author huangweii 2015年5月29日 
  22.  */  
  23. @Controller  
  24. @RequestMapping("/stub")  
  25. public class StubController {  
  26.     public static final String stub_folder = "stub/";  
  27.     public static final String stub_file_Suffix = ".json";  
  28.     protected Logger logger = Logger.getLogger(this.getClass());  
  29.   
  30.     /*** 
  31.      * @param request 
  32.      * @param action 
  33.      * @param callback 
  34.      * @return 
  35.      */  
  36.     @ResponseBody  
  37.     @RequestMapping(value = "/{action}", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF)  
  38.     public String corsJsonSimple(HttpServletRequest request,  
  39.                                  @PathVariable String action, String callback, String charset) {  
  40.         return stubAction(request, stub_folder + action + stub_file_Suffix, callback, charset);  
  41.     }  
  42.   
  43.     /*** 
  44.      * @param request 
  45.      * @param namespace 
  46.      * @param action 
  47.      * @param callback 
  48.      * @return 
  49.      */  
  50.     @ResponseBody  
  51.     @RequestMapping(value = "/{namespace}/{action}", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF)  
  52.     public String corsJsonSimple(HttpServletRequest request,  
  53.                                  @PathVariable String namespace, @PathVariable String action,  
  54.                                  String callback  
  55.             , String charset) {  
  56.         return stubAction(request, stub_folder + namespace + "/" + action  
  57.                 + stub_file_Suffix, callback, charset);  
  58.     }  
  59.   
  60.     private String stubAction(HttpServletRequest request, String actionPath, String callback, String charset) {  
  61.         if (ValueWidget.isNullOrEmpty(charset)) {  
  62.             charset = SystemHWUtil.CURR_ENCODING;  
  63.         }  
  64.         String content = stub(request, actionPath, charset);  
  65.         logger.info(SystemHWUtil.CRLF + content);  
  66.         return HWJacksonUtils.getJsonP(content, callback);  
  67.     }  
  68.   
  69.   
  70.     @ResponseBody  
  71.     @RequestMapping(value = "/{group}/{namespace}/{action}", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF)  
  72.     public String stubAction(HttpServletRequest request,  
  73.                              @PathVariable String group,  
  74.                              @PathVariable String namespace, @PathVariable String action,  
  75.                              String callback  
  76.             , String charset) {  
  77.         return stubAction(request, stub_folder + group + "/" + namespace + "/" + action  
  78.                 + stub_file_Suffix, callback, charset);  
  79.     }  
  80.   
  81.     @ResponseBody  
  82.     @RequestMapping(value = "/{version}/{group}/{namespace}/{action}", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF)  
  83.     public String stubAction(HttpServletRequest request,  
  84.                              @PathVariable String version,  
  85.                              @PathVariable String group,  
  86.                              @PathVariable String namespace, @PathVariable String action,  
  87.                              String callback  
  88.             , String charset) {  
  89.         return stubAction(request, stub_folder + version + "/" + group + "/" + namespace + "/" + action  
  90.                 + stub_file_Suffix, callback, charset);  
  91.     }  
  92.   
  93.     private String stub(HttpServletRequest request, String path) {  
  94.         return stub(request, path, SystemHWUtil.CURR_ENCODING);  
  95.     }  
  96.   
  97.     /*** 
  98.      * 读取文件 
  99.      * 
  100.      * @param request 
  101.      * @param path 
  102.      * @param charset 
  103.      * @return 
  104.      */  
  105.     private String stub(HttpServletRequest request, String path, String charset) {  
  106.         String content = null;  
  107.         try {  
  108.             String realPath2 = WebServletUtil.getRealPath(request, path);  
  109.             java.io.InputStream input = new FileInputStream(realPath2);  
  110.             content = FileUtils.getFullContent2(input, charset, true);  
  111.         } catch (java.io.FileNotFoundException ex) {  
  112.             ex.printStackTrace();  
  113.         } catch (IOException e) {  
  114.             e.printStackTrace();  
  115.         }  
  116.         return content;  
  117.     }  
  118.   
  119. }  

 

相关文章
|
2月前
|
监控 前端开发 Java
分布式链路监控系统问题之执行原方法时不能调用method.invoke的问题如何解决
分布式链路监控系统问题之执行原方法时不能调用method.invoke的问题如何解决
|
Web App开发 前端开发 JavaScript
答网友提问:为什么语句 var oModel = this.stub() 是构造一个stub对象? stub()是一个函数,从哪里来的?
答网友提问:为什么语句 var oModel = this.stub() 是构造一个stub对象? stub()是一个函数,从哪里来的?
|
3月前
|
安全 编译器 程序员
开发与运维调用问题之add(1.0f, 2.0)这个调用会匹配哪个版本的add函数如何解决
开发与运维调用问题之add(1.0f, 2.0)这个调用会匹配哪个版本的add函数如何解决
28 5
|
3月前
|
网络协议 开发者
迭代重构问题之没有日常迭代的微重构例子,如何解决
迭代重构问题之没有日常迭代的微重构例子,如何解决
‘}‘ expected,解决问题的思路是生成token没反应,解决问题的方法是认真比较,同时同一功能的接口一定要写在一个Controller类下,别写到类外面
‘}‘ expected,解决问题的思路是生成token没反应,解决问题的方法是认真比较,同时同一功能的接口一定要写在一个Controller类下,别写到类外面
一分钟教会你使用Builder构建链式调用
一分钟教会你使用Builder构建链式调用
77 0
|
算法
谈一谈|return None来看递归函数流程解析
谈一谈|return None来看递归函数流程解析
93 0
|
前端开发
前端学习案例1-call,apply的重用
前端学习案例1-call,apply的重用
72 0
前端学习案例1-call,apply的重用
|
安全 Android开发 Kotlin
viewBinding的使用记一次重构项目的过程
最近放寒假了,终于有空做项目了,想着把之前的一些项目重构一下,碰巧重构到 view Binding 这块,之前都是用 kotlin 的那个扩展,其实刚开始做项目的时候这个就已经废弃了,由于当时自己有点懒,没去学习这个新的代替方案,所以就成为一个历史遗留的问题,参考官方文档
173 0
|
存储 移动开发 JavaScript
学习todo-list源码📒 真的学会了很多开发实践!
学习todo-list源码📒 真的学会了很多开发实践!
331 0