1. 首页
  2. IT资讯

某小公司RESTful、共用接口、前后端分离、接口约定的实践

“u003Cpu003EJava后端,选择u003Cu002Fpu003Eu003Cpu003E技术博文,及时送达u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FReU3KFWHGbeY5a” img_width=”535″ img_height=”10″ alt=”某小公司RESTful、共用接口、前后端分离、接口约定的实践” inline=”0″u003Eu003Cpu003E作者 | 邵磊u003Cu002Fpu003Eu003Cpu003E链接 | juejin.imu002Fpostu002F59eafab36fb9a045076eccc3u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E前言u003Cu002Fh1u003Eu003Cpu003E随着互联网高速发展,公司对项目开发周期不断缩短,我们面对各种需求,使用原有对接方式,各端已经很难快速应对各种需求,更难以提高效率。于是,我们不得不重新制定对接规范、开发逻辑以便快速上线项目。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E我们的目标u003Cu002Fh1u003Eu003Culu003Eu003Cliu003Eu003Cpu003E尽可能的缩小沟通的成本,开最少的会,确定大部分的事。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E花最少的时间写文档,保证90%的开发人员看懂所有内容。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E哪怕不看文档,也能知道各种接口逻辑。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E不重复写代码u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E尽可能的写高可读性的代码u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E我们做了哪些事u003Cu002Fh1u003Eu003Culu003Eu003Cliu003Eu003Cpu003E完成了前后端分离u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003EAndroid、ios、web共用一套接口u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E统一接口规范(post、put、get、patch、delete)u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E统一了调试工具u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E统一了接口文档u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E之前的我们u003Cu002Fh1u003Eu003Cpu003Eu003Cstrongu003E接口是这样子的:u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FReU3KaIGfQvC5p” img_width=”482″ img_height=”258″ alt=”某小公司RESTful、共用接口、前后端分离、接口约定的实践” inline=”0″u003Eu003Cpu003Eu003Cstrongu003Eu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003E客户端u003Cu002Fiu003E请求是这样的:u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E…u002Fprojectu002Fmodel1u002FgetProducts?id=1&a=2&b=3&c=4&d=5…………u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003EA页面->B页面(携带n个变量)->C页面(携带m个变量,包含i个A页面的变量)经常n>4u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E大部分请求是POST,至于put、patch、delete是什么鬼,关我屁事。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E关于接口入参使用json,那完全是看开发心情。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cstrongu003E出参是这样的:u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpreu003Eu003Cpu003Eu003Ccodeu003E{“message”:”success”,”code”:0,”data”:具体内容}u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fpreu003Eu003Cpu003E其中data里包含数组可能是:u003Cu002Fpu003Eu003Cpreu003Eu003Cpu003Eu003Ccodeu003E[{“a”:”1″,”b”:”1″},{“a”:”1″,”b”:”1″},{“a”:”1″,”b”:”1″},u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fpreu003Eu003Cpu003E{“a”:”1″,”b”:”1″}]即使下一个页面用到也不会使用id,而是把所有字段都传进去。A接口中,返回产品用product;B接口中使用good,多个接口很可能不统一。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003Eu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003E客户端u003Cu002Fiu003E对接是这样子的:u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Culu003Eu003Cliu003Eu003Cpu003E安卓、ios一套;部分接口各自用一套;html5端一套。u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003Eu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003E客户端u003Cu002Fiu003E和后台是不停交流的u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003Eu003Cstrongu003E接口文档是这样的u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FReU3KaiAyOS61c” img_width=”640″ img_height=”371″ alt=”某小公司RESTful、共用接口、前后端分离、接口约定的实践” inline=”0″u003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FReU3Kb33oBztXl” img_width=”640″ img_height=”370″ alt=”某小公司RESTful、共用接口、前后端分离、接口约定的实践” inline=”0″u003Eu003Culu003Eu003Cliu003Eu003Cpu003Eswaggeru003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E阿里的rapu003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003EWord文档u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cliu003Eu003Cpu003E其它u003Cu002Fpu003Eu003Cu002Fliu003Eu003Cu002Fulu003Eu003Cpu003E当然了,我觉得swagger和rap神器都是非常强大的,能够实现各种功能逻辑,但是考虑到开发人员掌握程度不通,复杂度较高,难以提高效率,我决定初期并不使用这两样神器。u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003E后端是这样的u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cblockquoteu003Eu003Cdivu003Eu003Cpu003E…u002FAprojectu002Fmodel1u002FgetProducts —-接口u003Cu002Fpu003Eu003Cpu003E…u002FAprojectu002Fmodel1u002FProducts.html —-页面u003Cu002Fpu003Eu003Cpu003E…u002FAprojectu002Fmodel1u002FProducts.js —-静态资源u003Cu002Fpu003Eu003Cu002Fdivu003Eu003Cu002Fblockquoteu003Eu003Cpu003E接口和静态资源缠在一块,毕竟很多页面可能是一位开发人员同时开发前端、后端,这里的弊端是,只需要自己清楚逻辑,很多做法临时应付,方案并不优雅,别人也很难看懂。一旦这位同事离职,很多说不清的逻辑就留给后人采坑了。u003Cu002Fpu003Eu003Cpu003Eu003Cstrong toutiao-origin=”strong” class=”highlight-text”u003E重构u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E下面步入正题,面对以上众多问题聊聊我是如何重新制定流程的u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E数据库约定u003Cu002Fh2u003Eu003Cpu003E约定数据库里所有表必须包含名为id主键字段。可能有人会说,正常来说不是每张表里都应该有id主键吗?但是,我们项目中由于之前开发不严谨,部分表没有id主键,或者不为id的主键。这里我们采用分布式的全球唯一码来作为id。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eapi出参约定u003Cu002Fh2u003Eu003Cpu003E约定所有出参里含list,且其他请求会用到这组list,则list里所有对象必须含id唯一标识。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E入参约定u003Cu002Fh2u003Eu003Cpu003E约定token身份认证统一传入参数模式,后端采用aop切面编程识别用户身份。其他参数一律为json。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Eresultfull接口约定u003Cu002Fh2u003Eu003Cpu003E首先我们选择一个名词复数,比如产品u003Cu002Fpu003Eu003Cpu003Eu003Cstrongu003Epost方法u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E新增一条记录u003Cu002Fpu003Eu003Cpu003E比如 u002Fproductsu003Cu002Fpu003Eu003Cpu003E则代表新增一条产品入参json如下:u003Cu002Fpu003Eu003Cpreu003Eu003Cpu003Eu003Ccodeu003E{u003Cu002Fcodeu003Eu003Ccodeu003E “name”:”我是一款新产品”,u003Cu002Fcodeu003Eu003Ccodeu003E “price”:100,u003Cu002Fcodeu003Eu003Ccodeu003E “kind”:”我的分类”,u003Cu002Fcodeu003Eu003Ccodeu003E “pic”:[一组图片],u003Cu002Fcodeu003Eu003Ccodeu003E u002Fu002F等等还有很多u003Cu002Fcodeu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fpreu003Eu003Cpu003EJava 代码control层u003Cu002Fpu003Eu003Cpreu003Eu003Cpu003Eu003Ccodeu003E@ResponseBodyu003Cu002Fcodeu003Eu003Ccodeu003E@RequestMu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003Eappu003Cu002Fiu003Eing(value = “u002FA项目u002FB模块u002Fproducts”, method = {RequestMethod.POST})u003Cu002Fcodeu003Eu003Ccodeu003Epublic ResultObject getProducts {u003Cu002Fcodeu003Eu003Ccodeu003E u002Fu002F具体逻辑。u003Cu002Fcodeu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cstrongu003Eput方法u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E新增某条记录u003Cu002Fpu003Eu003Cpu003E比如 u002Fproductsu002F1001u003Cu002Fpu003Eu003Cpu003E入参json如下:u003Cu002Fpu003Eu003Cpreu003Eu003Cpu003Eu003Ccodeu003E{u003Cu002Fcodeu003Eu003Ccodeu003E “name”:”我是一款新产品”,u003Cu002Fcodeu003Eu003Ccodeu003E “price”:100,u003Cu002Fcodeu003Eu003Ccodeu003E “kind”:”我的分类”,u003Cu002Fcodeu003Eu003Ccodeu003E “pic”:[一组图片],u003Cu002Fcodeu003Eu003Ccodeu003E u002Fu002F等等还有很多u003Cu002Fcodeu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fpreu003Eu003Cpu003E表示增加一条1001 id的记录u003Cu002Fpu003Eu003Cpu003EJava代码control层u003Cu002Fpu003Eu003Cpreu003Eu003Cpu003Eu003Ccodeu003E@ResponseBodyu003Cu002Fcodeu003Eu003Ccodeu003E @RequestMu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003Eappu003Cu002Fiu003Eing(value = “u002FA项目u002FB模块u002Fproductsu002F{id}”, method = {RequestMethod.PUT})u003Cu002Fcodeu003Eu003Ccodeu003E public ResultObject putProducts(@PathVariable(value = “id”) String id) {u003Cu002Fcodeu003Eu003Ccodeu003E u002Fu002F具体逻辑。u003Cu002Fcodeu003Eu003Ccodeu003E }u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cstrongu003Eget方法u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E获得所有记录u003Cu002Fpu003Eu003Cpu003Eu002Fproducts 则代表获取所有产品u003Cu002Fpu003Eu003Cpu003E因为有分页,所以我们后面加了 ?page=1&pageSize=50u003Cu002Fpu003Eu003Cpu003E我们约定了所有名词复数,都会返回list,且list每个对象都有字段为id的唯一id。u003Cu002Fpu003Eu003Cpu003E比如u003Cu002Fpu003Eu003Cpreu003Eu003Cpu003Eu003Ccodeu003E{u003Cu002Fcodeu003Eu003Ccodeu003E “data”:{“list”:[{“id”:”唯一id”,”其他很多字段”:””},{“id”:”唯一id”,”其他很多字段”:””}],”page”:1,其他字段},u003Cu002Fcodeu003Eu003Ccodeu003E “code”:0,u003Cu002Fcodeu003Eu003Ccodeu003E “message”:”成功”u003Cu002Fcodeu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fpreu003Eu003Cpu003Eu002Fproductsu002F{id} 获取某个具体产品(一定比列表更详细)u003Cu002Fpu003Eu003Cpu003E比如某个具体产品里还包含一个list,如该产品推荐列表,则:u002Fproductsu002F{id}u002Frecommendationsu003Cu002Fpu003Eu003Cpu003E假设它包含的不是一个list,而是对象,比如产品佣金信息,则:u002Fproductsu002F{id}u002FCommissionu003Cu002Fpu003Eu003Cpu003E这里我们以是否名词复数来判断是对象还是list.u003Cu002Fpu003Eu003Cpu003EJava代码control层u003Cu002Fpu003Eu003Cpreu003Eu003Cpu003Eu003Ccodeu003E@ResponseBodyu003Cu002Fcodeu003Eu003Ccodeu003E@RequestMu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003Eappu003Cu002Fiu003Eing(value = “u002FA项目u002FB模块u002Fproductsu002F{id}”, method = {RequestMethod.GET})u003Cu002Fcodeu003Eu003Ccodeu003Epublic ResultObject putProducts(@PathVariable(value = “id”) String id) {u003Cu002Fcodeu003Eu003Ccodeu003E u002Fu002F具体逻辑。u003Cu002Fcodeu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cstrongu003Epatch 方法u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E更新局部x产品y信息u003Cu002Fpu003Eu003Cpu003E入参是post方法时入参的子集,所有支持更新的参数会说明,并不是支持所有变量u003Cu002Fpu003Eu003Cpu003E如:u002Fproductsu002F{id}u003Cu002Fpu003Eu003Cpreu003Eu003Cpu003Eu003Ccodeu003E{u003Cu002Fcodeu003Eu003Ccodeu003E “name”:”我是一款新产品”,u003Cu002Fcodeu003Eu003Ccodeu003E “price”:100,u003Cu002Fcodeu003Eu003Ccodeu003E u002Fu002F部分变量u003Cu002Fcodeu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fpreu003Eu003Cpu003EJava代码control层u003Cu002Fpu003Eu003Cpreu003Eu003Cpu003Eu003Ccodeu003E@ResponseBodyu003Cu002Fcodeu003Eu003Ccodeu003E@RequestMu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003Eappu003Cu002Fiu003Eing(value = “u002FA项目u002FB模块u002Fproductsu002F{id}”, method = {RequestMethod.PATCH})u003Cu002Fcodeu003Eu003Ccodeu003Epublic ResultObject putProducts(@PathVariable(value = “id”) String id) {u003Cu002Fcodeu003Eu003Ccodeu003E u002Fu002F具体逻辑。u003Cu002Fcodeu003Eu003Ccodeu003E}u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cstrongu003Edelete方法u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E删除某记录u003Cu002Fpu003Eu003Cpu003E如:u002Fproductsu002F1001u003Cu002Fpu003Eu003Cpu003E删除1001产品。u003Cu002Fpu003Eu003Cpu003EJava代码control层u003Cu002Fpu003Eu003Cpreu003Eu003Cpu003Eu003Ccodeu003E@ResponseBodyu003Cu002Fcodeu003Eu003Ccodeu003E @RequestMu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-1″u003Eappu003Cu002Fiu003Eing(value = “u002FA项目u002FB模块u002Fproductsu002F{id}”, method = {RequestMethod.DELETE})u003Cu002Fcodeu003Eu003Ccodeu003E public ResultObject putProducts(@PathVariable(value = “id”) String id) {u003Cu002Fcodeu003Eu003Ccodeu003E u002Fu002F具体逻辑。u003Cu002Fcodeu003Eu003Ccodeu003E }u003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fpreu003Eu003Cpu003Eu003Cstrongu003E其他说明u003Cu002Fstrongu003Eu003Cu002Fpu003Eu003Cpu003E我们尽可能少的使用动词,但有一些行为需要使用动词,比如登录等。关于版本号,我们打算在模块后增加u002Fv1u002F等标识。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E权限约定u003Cu002Fh2u003Eu003Cpu003E服务端要对用户角色进行判断,是否有权限执行某个逻辑。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E前后端分离约定u003Cu002Fh2u003Eu003Cpu003E后端以开发接口为主,不再参与页面开发,或者混合式jsp页面开发,统一以接口形式返回,前端通过js渲染数据以及处理逻辑。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E共用接口u003Cu002Fh2u003Eu003Cpu003Eweb、Android、ios使用统一接口,不在因为哪方特殊要求额外开放接口。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E使用统一dao层生成工具u003Cu002Fh2u003Eu003Cpu003E基于mybatis-generator改造成适合我们项目的dao层以及部分service层,内部共同维护共同使用。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E使用postman最为接口文档、调试工具u003Cu002Fh2u003Eu003Cpu003E虽然有上文中介绍的rap和swagger都是特别牛的接口神器,但是我们还是选择了postman,开发人员将接口名称、说明、入参、出参,以及各种出参示例都存储,这样开发直接可以看得清接口含义。u003Cu002Fpu003Eu003Cblockquoteu003Eu003Cpu003Ehttps:u002Fu002Fdownload.csdn.netu002Fdownloadu002Fu003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-4″u003Eqqu003Cu002Fiu003E273681448u002F10033456u003Cu002Fpu003Eu003Cu002Fblockquoteu003Eu003Cpu003E打开360浏览器扩展中心,然后勾选开发者模式,再点击加载已解压的扩展程序,选中压缩包解压后的目录,最后点击运行即可。u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FReU3KbPA1dTF0g” img_width=”640″ img_height=”330″ alt=”某小公司RESTful、共用接口、前后端分离、接口约定的实践” inline=”0″u003Eu003Cpu003E其中出参注释、及接口说明,写在tests里:u003Cu002Fpu003Eu003Cpreu003Eu003Cpu003Eu003Ccodeu003Eu002F*u003Cu002Fcodeu003Eu003Ccodeu003E这里是接口说明,和每个出参、入参的意思。u003Cu002Fcodeu003Eu003Ccodeu003E*u002Fu003Cu002Fcodeu003Eu003Cu002Fpu003Eu003Cu002Fpreu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FReU3Kbl7hsc3v5″ img_width=”596″ img_height=”369″ alt=”某小公司RESTful、共用接口、前后端分离、接口约定的实践” inline=”0″u003Eu003Cpu003E接口按模块划分为文件夹:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp3.pstatp.comu002Flargeu002Fpgc-imageu002FReU3L1LFjV7pcZ” img_width=”320″ img_height=”712″ alt=”某小公司RESTful、共用接口、前后端分离、接口约定的实践” inline=”0″u003Eu003Cpu003E入参:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FReU3L1dFcYVQC8″ img_width=”640″ img_height=”292″ alt=”某小公司RESTful、共用接口、前后端分离、接口约定的实践” inline=”0″u003Eu003Cpu003E出参示例:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp1.pstatp.comu002Flargeu002Fpgc-imageu002FReU3L1x7jsiMFT” img_width=”350″ img_height=”301″ alt=”某小公司RESTful、共用接口、前后端分离、接口约定的实践” inline=”0″u003Eu003Cpu003E正常请求:u003Cu002Fpu003Eu003Cimg src=”http:u002Fu002Fp9.pstatp.comu002Flargeu002Fpgc-imageu002FReU3L2CEwdmlA” img_width=”640″ img_height=”129″ alt=”某小公司RESTful、共用接口、前后端分离、接口约定的实践” inline=”0″u003Eu003Cpu003E开发人员即可直接看到接口示例进行开发,而开发人员开发的时候,自己调用一次即可保存为postman文件,为了加快上线,我们允许将java中实体类变量定义的代码(含注释)直接复制粘贴出来。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003Ejs等静态资源缓存问题u003Cu002Fh2u003Eu003Cpu003E从短期角度上讲,我的要求是减少js文件的变更,如果有变更,务必更改版本号。那么如何减少修改,我们的做法是将一部分js写在html内,反正前后端分离,大不了刷新一下cdn的节点缓存,毕竟大部分浏览器也不会主动缓存html文件(大部分浏览器会缓存js等文件)。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch2 toutiao-origin=”h3″u003E统一js请求框架u003Cu002Fh2u003Eu003Cpu003E这里我们使用angular js的请求框架,因为我们内部对angularjs使用较多,比较熟悉,封装后的请求,可以自动弹窗错误请求,可复写错误回调。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E目前效果u003Cu002Fh1u003Eu003Cpu003E目前,我们u003Ci class=”chrome-extension-mutihighlight chrome-extension-mutihighlight-style-2″u003E客户端u003Cu002Fiu003E看到接口,大概能说出其意思,也能猜出一连串接口的含义,比如u003Cu002Fpu003Eu003Cpu003E如:u002Fclassesu003Cu002Fpu003Eu003Cpu003E可以看出它是获取班级列表接口,u003Cu002Fpu003Eu003Cpu003E猜到u003Cu002Fpu003Eu003Cpu003Eu002Fclassesu002Fid get获取id为id的班级详情u003Cu002Fpu003Eu003Cpu003Eu002Fclassesu002Fid patch 修改班级信息u003Cu002Fpu003Eu003Cpu003Eu002Fclassesu002Fid delete 删除班级信息u003Cu002Fpu003Eu003Cpu003E至于入参,patch是post的子集、put=patch、delete无入参。u003Cu002Fpu003Eu003Cpu003E而入参含义,直接打开postman可以直接查看每个字段的含义,并且,可以实时调取开发环境数据(非开发人员电脑),这里我们使用了多环境,详情可了解:u003Cu002Fpu003Eu003Cblockquoteu003Eu003Cpu003Ehttps:u002Fu002Fjuejin.imu002Fpostu002F59e1d92d51882578db27c2e1u003Cu002Fpu003Eu003Cu002Fblockquoteu003Eu003Cpu003E前端使用统一封装后的js请求框架也加快了开发进度,不用造轮子。u003Cu002Fpu003Eu003Cpu003E开发人员,一般代码开发写好,使用postman自我测试,测试完成后,接口文档也就写好了。u003Cu002Fpu003Eu003Cpu003E测试人员想了解接口文档的也可以直接使用postman进行导入查看。u003Cu002Fpu003Eu003Cpu003E至此,我们交流成本下降了一大半,剩下开会的内容就是按ui分解需求或者按ui施工了。u003Cu002Fpu003Eu003Cpu003Eu003Cu002Fpu003Eu003Ch1 toutiao-origin=”h2″u003E总结u003Cu002Fh1u003Eu003Cpu003E经过一番的折腾,开发进度总算快了点,也一定程度上达到了快速上线项目的效果。关于restful风格api,每个人都有自己的见解,只要内部约定清楚,能尽可能少的减少沟通,我觉得就是好的理解。至于接口工具,可能很多人会说为什么不用之前的,我觉得以后还是会用的,最好能做到插件自动化生成api,但是对java开发注释要求比较严格,随意慢慢来吧,毕竟后面我们还有很多路要走。u003Cu002Fpu003Eu003Cp class=”pgc-end-source”u003E-END-u003Cu002Fpu003E”

原文始发于:某小公司RESTful、共用接口、前后端分离、接口约定的实践

主题测试文章,只做测试使用。发布者:℅傍ㄖ免沦陷dε鬼,转转请注明出处:http://www.cxybcw.com/17960.html

联系我们

13687733322

在线咨询:点击这里给我发消息

邮件:1877088071@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code