现在趋向于前台和后台分层开发
前端调用后台接口获取数据,然后在页面展示.
但是有时候前台(静态资源)和后台联调时很麻烦:
(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; } }
相关推荐
单元测试打桩开源库 cpp-stub 使用手册 中文版本,这是从git上直接下载的,git上下载的源代码在arm上调用Stub.reset方法会引发段错误,在资源cpp-stub开源代码(下载地址:...
Axis使用Stub方式开发Webservice只要看这个,十分钟包你学会!!!
这是一个单元测试打桩开源代码,在git上下载的代码在ARM平台上有一个BUG,使用stub.h中的reset方法时,会引起段错误,该资源对这个bug进行了修复。
主要包含了使用Axis1生成stub客户端的样例。
gtest stub 详细用法,附件用例,链接
赠送jar包:grpc-stub-1.24.0.jar; 赠送原API文档:grpc-stub-1.24.0-javadoc.jar; 赠送源代码:grpc-stub-1.24.0-sources.jar; 赠送Maven依赖信息文件:grpc-stub-1.24.0.pom; 包含翻译后的API文档:grpc-stub-...
com.stub.StubApp.apk
Android源代码 启动时隐藏StubView,点击Show按钮显示StubView,点击Hide隐藏StubView.
OSPF 路由配置 - Stub 区域配置指南 OSPF(Open Shortest Path First)是一种链路状态路由协议,广泛应用于大型企业网络和ISP网络中。作为一种内部网关协议(IGP),OSPF 能够提供高效、可靠的路由选择和网络拓扑...
1037571306982519com.stub.StubApp.apk
com.stub.StubApp.apk.1
Firefox Setup Stub 23.0.1
com.stub.StubApp.apk.1.1
stub测试桩函数库
用于演示PE变形拓展STUB的蓝本程序。
stub_manifest.exe下载资源
通过stub例程实现远程过程调用
IPackageInstallObserver$Stub.class 如果你的版本是android1.5以上的话,就没有这个class文件了 ,把这 个文件,放到.android sdk/android-17/android.jar文件里。放入到相应的目录,也就是,/android/comtent/pm/...
在配置 OSPF 末梢路由Stub之前,需要先进行基本的网络配置,包括 IP 地址分配、子网掩码、默认网关等。 2. 信息同步配置 OSPF 协议需要同步路由信息,确保网络中的所有路由器都能获取最新的路由信息。在此步骤中,...