现在趋向于前台和后台分层开发
前端调用后台接口获取数据,然后在页面展示.
但是有时候前台(静态资源)和后台联调时很麻烦:
(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 框架
核心控制器:
package com.web.controller.comm; import java.io.FileInputStream; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.common.util.SystemHWUtil; import com.common.util.WebServletUtil; import com.io.hw.file.util.FileUtils; import com.util.JSONPUtil; /*** * 用于stub * * @author huangweii 2015年5月29日 */ @Controller @RequestMapping("/stub") public class StubController { protected Logger logger = Logger.getLogger(this.getClass()); public static final String stub_folder = "stub/"; public static final String stub_file_Suffix = ".json"; /*** * * @param request * @param action * @param callback * @return */ @ResponseBody @RequestMapping(value = "/{action}", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF) public String corsJsonSimple(HttpServletRequest request, @PathVariable String action, String callback) { String content = null; content = stub(request, stub_folder + action + stub_file_Suffix); return JSONPUtil.getJsonP(content, callback); } /*** * * @param request * @param namespace * @param action * @param callback * @return */ @ResponseBody @RequestMapping(value = "/{namespace}/{action}", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF) public String corsJsonSimple(HttpServletRequest request, @PathVariable String namespace, @PathVariable String action, String callback) { String content = null; content = stub(request, stub_folder + namespace + "/" + action + stub_file_Suffix); return JSONPUtil.getJsonP(content, callback); } private String stub(HttpServletRequest request, String path) { return stub(request, path, SystemHWUtil.CURR_ENCODING); } /*** * 读取文件 * @param request * @param path * @param charset * @return */ private String stub(HttpServletRequest request, String path,String charset) { String content = null; try { String realPath2 = WebServletUtil.getRealPath(request, path); java.io.InputStream input = new FileInputStream(realPath2); content = FileUtils.getFullContent2(input,charset); } catch (java.io.FileNotFoundException ex) { ex.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return content; } }
核心方法:
/** * 获取相对地址的绝对地址 * * @param request * @param relativePath * @return */ public static String getRealPath(HttpServletRequest request, String relativePath) { return request.getSession().getServletContext().getRealPath(relativePath); }
--------控制器更新了 2016-01-24--------
package oa.web.controller.common; import com.common.util.SystemHWUtil; import com.common.util.WebServletUtil; import com.io.hw.file.util.FileUtils; import com.io.hw.json.HWJacksonUtils; import com.string.widget.util.ValueWidget; import org.apache.log4j.Logger; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; import java.io.FileInputStream; import java.io.IOException; /*** * 用于stub * * @author huangweii 2015年5月29日 */ @Controller @RequestMapping("/stub") public class StubController { public static final String stub_folder = "stub/"; public static final String stub_file_Suffix = ".json"; protected Logger logger = Logger.getLogger(this.getClass()); /*** * @param request * @param action * @param callback * @return */ @ResponseBody @RequestMapping(value = "/{action}", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF) public String corsJsonSimple(HttpServletRequest request, @PathVariable String action, String callback, String charset) { return stubAction(request, stub_folder + action + stub_file_Suffix, callback, charset); } /*** * @param request * @param namespace * @param action * @param callback * @return */ @ResponseBody @RequestMapping(value = "/{namespace}/{action}", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF) public String corsJsonSimple(HttpServletRequest request, @PathVariable String namespace, @PathVariable String action, String callback , String charset) { return stubAction(request, stub_folder + namespace + "/" + action + stub_file_Suffix, callback, charset); } private String stubAction(HttpServletRequest request, String actionPath, String callback, String charset) { if (ValueWidget.isNullOrEmpty(charset)) { charset = SystemHWUtil.CURR_ENCODING; } String content = stub(request, actionPath, charset); logger.info(SystemHWUtil.CRLF + content); return HWJacksonUtils.getJsonP(content, callback); } @ResponseBody @RequestMapping(value = "/{group}/{namespace}/{action}", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF) public String stubAction(HttpServletRequest request, @PathVariable String group, @PathVariable String namespace, @PathVariable String action, String callback , String charset) { return stubAction(request, stub_folder + group + "/" + namespace + "/" + action + stub_file_Suffix, callback, charset); } @ResponseBody @RequestMapping(value = "/{version}/{group}/{namespace}/{action}", produces = SystemHWUtil.RESPONSE_CONTENTTYPE_JSON_UTF) public String stubAction(HttpServletRequest request, @PathVariable String version, @PathVariable String group, @PathVariable String namespace, @PathVariable String action, String callback , String charset) { return stubAction(request, stub_folder + version + "/" + group + "/" + namespace + "/" + action + stub_file_Suffix, callback, charset); } private String stub(HttpServletRequest request, String path) { return stub(request, path, SystemHWUtil.CURR_ENCODING); } /*** * 读取文件 * * @param request * @param path * @param charset * @return */ private String stub(HttpServletRequest request, String path, String charset) { String content = null; try { String realPath2 = WebServletUtil.getRealPath(request, path); java.io.InputStream input = new FileInputStream(realPath2); content = FileUtils.getFullContent2(input, charset, true); } catch (java.io.FileNotFoundException ex) { ex.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return content; } }
相关推荐
在实际操作中,`tripleStub.m`可能会首先定义所需的参数,比如工作频率、负载阻抗、 stub的初始长度等,然后通过迭代优化算法找到最佳的stub长度组合。这些优化算法可能包括梯度下降法、牛顿法或者更高级的全局优化...
在这个例子中,"aether-spi-0.1-stub.jar"是Aether SPI的一个特定版本的实现,可能是为了方便开发人员在没有完整Aether库的情况下进行工作。 6. **依赖包**: 在Java开发中,"依赖包"指的是项目运行或构建所必需的...
开发者只需要根据UML模型,就能快速构建出符合设计的Java代码结构,便于快速原型实现和迭代开发。 此外,StarUML支持JAVA逆向工程,即从已有的Java源代码生成对应的UML图表。这一特性对于理解和重构已有代码库非常...
它允许开发者在开发过程中快速迭代,避免了频繁与远程服务器交互的延迟,提高了开发效率。这个库的版本为0.0.1,支持Python 3,且不依赖特定的硬件架构或操作系统。 二、Google Cloud Datastore Google Cloud ...
- 使用Stub进行测试 - 使用Mock进行测试 - 多线程测试 - 数据库测试 - Web组件测试 - MVC测试(如Struts、Spring MVC和WebWork 2) - EJB测试 通过学习这些案例,开发者可以更加深入地理解如何在不同的应用场景下...
通过使用 `l5scaffold`,你可以提高开发效率,减少重复性工作,专注于核心业务逻辑。 **1. 脚手架系统** 在软件开发中,脚手架是一种快速创建常见结构的方法,例如模型、视图、控制器、迁移以及测试。`l5scaffold`...
安装完成后,用户就可以使用这款强大的浏览器来浏览网页,体验其快速的JavaScript引擎、内置的隐私保护功能、以及丰富的扩展插件生态系统。 标签“Firefox安装包”进一步明确了这个文件的主要用途,即用于安装Fire...
HAL框架的存在就是为了支持底层模块的快速迭代和更新,从而降低改版成本,提高竞争力。 Google的HAL框架设计主要目标在于: 1. **接口定义**:HAL提供了对上层应用的接口,以及对底层硬件驱动的接口。这样使得驱动...
【通用性接口设计范例1】探讨的是在软件开发中如何设计通用性接口,以便于实现灵活、可扩展和敏捷的系统...在敏捷开发环境中,这种设计方法尤为关键,因为它允许快速响应用户需求,实现快速迭代和高质量的软件产品。
综上所述,这个压缩包提供的“Firefox火狐浏览器官方46.0.1-win32版本exe在线安装包”是一个方便用户在32位Windows系统上快速安装Firefox的工具,通过运行“Firefox Setup Stub 46.0.1.exe”即可开始安装流程,享受...
本文将针对49.0b2-win32版本的Firefox进行详细解析,旨在帮助用户更好地理解和使用这一版本的浏览器。 首先,"Firefox火狐浏览器官方49.0b2-win32版本exe在线安装包"表明这是一个适用于Windows 32位系统的Firefox...
该版本号中的“b7”代表这是一个测试版,意味着在正式发布前,开发者已经进行了多次迭代以优化性能和修复已知问题,但可能仍存在一些不稳定因素,适合对新功能有热情的用户试用。 Firefox 18.0b7的主要改进和特性...
标题中的“Firefox火狐浏览器官方52.0b2-win32版本exe...总的来说,这个压缩包提供了一个预览版本的Firefox浏览器,旨在让用户在正式版本发布前进行试用和反馈,同时也展示了Mozilla在软件开发中的迭代和持续优化过程。
随着时间的推移,Firefox不断更新迭代,优化性能,增加新功能,以适应互联网的快速发展。 二、Firefox 35.0的主要特性 1. 性能提升:Firefox 35.0在速度上进行了显著的优化,加载网页更快,提升了整体用户体验。 ...
Firefox 38.0.5b3属于一个早期的版本,其中“b3”表示这个版本是Beta测试的第三个迭代,这意味着它在正式发布之前已经经过了多次改进和测试,但可能仍存在一些未解决的问题或已知的bug。 这个版本的Firefox可能包含...
"Setup Stub"的命名意味着这是一个精简版的安装程序,它能够在用户机器上快速下载并安装完整版本的Firefox。该版本号中的“b2”代表“beta 2”,即第二个测试版,意味着它包含了最新的开发成果,同时也可能包含一些...
通过运行其中的“Firefox Setup Stub 51.0b8.exe”文件,用户可以便捷地安装这款浏览器,享受其安全、快速和高度可定制的浏览体验。同时,由于是测试版,用户可能会遇到一些尚未在正式版本中修复的问题,但这也是...
Stub Installer是一种轻量级下载器,它会在下载完成后自动从Mozilla服务器获取完整的安装文件,减少了初次下载的大小,方便用户快速安装。 安装Firefox 33.0b6-win32的过程相当简单。首先,双击运行"Firefox Setup ...
淘宝高性能移动网关是一个集成了多方面功能的解决方案,它通过统一接入和API动态发布等核心功能,实现了服务端和客户端的高效对接,同时提供了完整的监控和安全策略,确保了整个系统的高可用性和快速迭代能力。...