为什么前后端分离了,你比从前更痛苦?

640?wx_fmt=gif

你有没有遇到过:

  • 前端代码刚写完,后端的接口又变了。

  • 接口文档永远都是不对的。

  • 测试工作永远只能临近上线才能开始。

为什么前后端分离了,你比从前更痛苦?

前后端分离早已经不是新闻,当真正分离之后确遇到了更多问题。要想解决现在的痛,就要知道痛的原因:


为什么接口会频繁变动?


设计之初没有想好。 这需要提高需求的理解能力和接口设计能力。


变动的成本较低。


德国有句谚语:“朝汤里吐口水。” 只有这样,才能让人们放弃那碗汤,停止不合理的行为。前后端同学坐在一起工作的时候效率会有提升,当后端同学接口变化时,只需要口头上通知一下即可,我们没有文档,我们很敏捷啊。没错,我们需要承认这样配合开发的效率会很高,但是频繁的变动会导致不断返工,造成了另一种浪费,这种浪费是可以被减少,甚至是被消除的。


为什么接口文档永远都是不对的?


接口文档在定接口时起到一定作用,写完接口就没有用了。后面接口的频繁变化,文档必定会永远落后于实际接口,维护文档的带来了一定的成本却没能带来价值。除非对外提供的接口,否则文档谁来看呢?没人看,用处又在哪?


有些公司干脆丢掉接口文档,说我们要拥抱敏捷。


所以接口文档落后的原因在于没有给我们带来价值。


为什么测试工作永远只能临近上线才能开始?


一个需求,后端开发 4 天,前端开发 4 天,联调 4 天,留给测试同学只有2天时间甚至更少,测不完只能带 bug 上线。


640?wx_fmt=jpeg


在开发阶段测试同学无法介入,接口在变,前端也在变, “提测” 之前只能喝茶,“提测” 之后又忙的要命。


自动化?想都别想,空有一身好本领,在 “拥抱变化” 之后只能手工测试。偶尔还要拉上前台美眉客串一下测试小妹。手工测试枯燥乏味,乏味的工作就容易出错,而且还不能快速重复,无法对测试过的功能快速回归。

怎么破?

解决以上问题要让接口文档发挥价值,提高变动接口的成本,测试尽早介入。


接口文档发挥出价值,就要赋予契约的意义,就如同签字画押谁也不许变,来约束我们只认契约不认人。


契约应该由前端同学来驱动,前后端共同协商。由于前端同学与 UX 接触比较紧密,更了解页面所需的数据以及整体的 User Journey,前端同学驱动会更加合理。


契约敲定之后要帮助我们生成 Mock Server(后面我们会介绍一个工具),前后端同学就要依照契约各自开发。Mock Server 可暂时替代后台服务,帮组前端开发,同时,测试同学也可以依照契约文档来编写测试脚本,使用 Mock Server 进行脚本验证。


640?wx_fmt=jpeg


当后端接口发生变化除了口头通知以外必须修改契约,前端同学和测试同学才能各自修改。如此一来修改契约的成本变高,人们在定契约时则会更加慎重,也会促使我们提高接口的设计能力。


看到图中没有 “联调” 的环节,并不是画错了,而是 “联调“ 不再是一项工作,在部署后只需要更改代理的配置即可。甚至使用现代前端框架(如,Vue 或者 React)只要在开发时配置一下,之后都不需要调整任何代码。


“提测” 呢?测试一直都在进行,也就不再有一个 ”提测“ 的环节,无论前后端任意一方完成开发,测试同学都可以进行测试。


理论终于扯完了,说起来容易做起来难啊,需要工具来帮助我们。接口描述的工具有很多,比较知名的 Swagger 和 Raml,我个人更倾向于 Raml 。


640?wx_fmt=gif


描述工具生成文档还不够,还要生成 Mock Server,如果描述工具和 Mock Server 是分离又带来了额外的工作,好在有她——raml-mocker。

raml-mocker

raml-mocker 是一个基于 Raml 使用 Nodejs 开发的 Mock Server 工具,使用 Raml 描述接口中设置 response 的 example 指令即可,raml-mocker 会解析 Raml 文件,并启动一个 Mock Server,将 example 的内容返回给浏览器。


开始


初始化项目

git clone https://github.com/xbl/raml-mocker-starter.git raml-api
cd raml-api
git remote rm origin


安装

yarn
# or
npm install


启动 mock server

yarn start
# or
npm start


测试

curl -i http://localhost:3000/api/v1/users/1/books/
# or
curl -i http://localhost:3000/api/v1/users/1/books/1


生成 API 可视化文档

yarn run build
# or
npm run build


此功能使用了raml2html。


配置 .raml-config.json


{
  "controller""./controller",
  "raml""./raml",
  "main""api.raml",
  "port"3000,
  "plugins": []
}


  • controller:controller 目录路径,在高级篇中会有更详细说明

  • raml:raml 文件目录

  • main:raml 目录下的入口文件

  • port:mock server 服务端口号

  • plugins:插件


入门篇:Mock Server


raml-mocker 只需要在response 添加 example:


/books:
  /:id:
    post:
      body:
        application/json:
          type: abc
      responses:
        200:
          body:
            application/json:
              type: song
              # 返回的 Mock 数据
              example: !include ./books_200.json


books_200.json


{
  "code"200,
  "data": [
    {
      "id"1,
      "title""books title",
      "description""books desccription1"
    },
    {
      "id"2,
      "title""books title",
      "description""books desccription2"
    }
  ]
}


通过 curl 请求:


curl -i http://localhost:3000/api/v1/users/1/books


就会得到 example 的数据,唯一不足是无法根据参数动态返回不同数据。别急,请往下看。


高级篇:动态 Server


如果静态的 Mock 数据不能满足你的需求,Raml-mocker 还提供了动态的功能。


在 raml 文档中添加 (controller) 指令,即可添加动态的 Server,如:


/books:
  type:
    resourceList:
  get:
    description: 获取用户的书籍
    (controller): user#getBook
    responses:
      200:
        body:
          type: song[]
          example: !include ./books_200.json


在文档中 (controller) 表示 controller 目录下 user.js 中 getBook 函数。


controller/user.js


exports.getBook = (req, res, webApi) => {
  console.log(webApi);
  res.send('Hello World!');
}


Raml-mocker 是在 expressjs 基础上进行开发,req、res 可以参考 express 文档。

webApi 会返回文档中的配置:


{
  "absoluteUri""/api/:version/users/:user_id/books",
  "method""get",
  "controller""user#getBook",
  "responses": [
    {
      "code""200",
      "body""... example ...",
      "mimeType""application/json"
    }
  ]
}


如此,raml-mocker 提供了更多可扩展空间,我们甚至可以在 controller 中实现一定的逻辑。


插件


Raml-mocker 提供了插件机制,允许我们在不使用 controller 指令的时候对 response 的内容进行处理,例如使用 Mockjs。


.raml-config.json


{
  "controller""./controller",
  "raml""./raml",
  "main""api.raml",
  "port"3000,
  "plugins": ["./plugins/mock.js"]
}


/plugins/mock.js


var { mock } = require('mockjs');

module.exports = (body) => {
  try {
    return mock(JSON.parse(body));
  } catch(e) {}
  return body;
}


Enjoy it!

总结

前后端分离可以让我们的职责更清晰,打破前端发挥的局限,工作解耦之后能更好的提高开发效率。然而因为没有规划好开发流程,导致了我们没有发挥出其应有的价值,造成了更多的浪费。


raml-mocker 能够帮助我们在工具上解决一定的问题,更重要的是持续改进的思想,只有团队的思想是统一的才有可能达到快速交付。


希望能对你有所帮助,谢谢!


来自:Java编程

作者:谢小呆

链接

https://my.oschina.net/xbl/blog/2246297

版权归原作者所有,转载仅供学习使用,不用于任何商业用途,如有侵权请留言联系删除,感谢合作。


数据与算法之美

用数据解决不可能


640?wx_fmt=jpeg


长按扫码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302621.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

响应式设计(Response Web Design)浅谈

响应式Web设计,这个话题可能是当下Web设计领域里讨论和应用比较多的话题了,为什么要响应式Web设计?什么是响应式Web设计? Web发展迅速,各种应用和服务层出不穷,现在打开电脑,可能使用最多的程序应该是浏览器了&#…

现在6岁的小朋友都开始学编程了……

前段时间,朋友跟小木说:现在的小孩什么都要学,以后是不是都要学编程了?小木鄙夷地笑了一下:他们已经学编程了啊!朋友表情↓↓↓朋友:纳尼???我到大学才接触编…

记一次 .NET 医院CIS系统 内存溢出分析

一:背景 1. 讲故事前几天有位朋友加wx求助说他的程序最近总是出现内存溢出,很崩溃,如下图:和这位朋友聊下来,发现他也是搞医疗的,哈哈,.NET 在医疗方面还是很有市场的????????????&…

丘成桐:完全不懂数学,才会有“数学无用”的说法

全世界有3.14 % 的人已经关注了数据与算法之美▲中国科学院院长白春礼(右)与数学家丘成桐(左)为晨兴数学金奖获得者李思(中)颁奖培养第一流的学生,首先要有对于学问的兴趣,而非奔着考…

动手实现一个适用于.NET Core 的诊断工具

前言大家可能对诊断工具并不陌生,从大名鼎鼎的 dotTrace,到 .NET CLI 推出的一系列的高效诊断组件(dotnet trace,dotnet sos,dotnet dump)等, 这些工具提升了对程序Debug的能力和效率,可以让开发人员从更高层次的维度来…

android 强制下线功能,Android学习之基础知识八—Android广播机制实践(实现强制下线功能)...

强制下线功能算是比较常见的了,很多的应用程序都具备这个功能,比如你的QQ号在别处登录了,就会将你强制挤下线。实现强制下线功能的思路比较简单,只需要在界面上弹出一个对话框,让用户无法进行任何操作,必须…

USB权限的设置

USB设备给我们日常生活中带了很多的方便,能够在不同的不同的移动设备中传递数据。但也给我们的数据安全带来了隐患,它可以拷贝走我们计算机中很机密的信息!通过下面的操作后,将使我们有用的信息增加更大安全性,至小也能…

漫谈高数——泰勒级数的物理意义

全世界有3.14 % 的人已经关注了数据与算法之美高等数学干吗要研宄级数问题?是为了把简单的问题弄复杂来表明自己的高深? No,是为了把各种简单的问题/复杂的问题,他们的求解过程用一种通用的方法来表示。提一个问题,99*99等于多少&…

保持学习,从这几个公众号开始!

全世界有3.14 % 的人已经关注了数据与算法之美关注了几百个公众号无目的的看文章却如鸡肋一般食之无味弃之可惜你是否也觉得时间被浪费?生命被辜负了?点击关注下面几个公众号它们每天更新有态度、有温度的原创文字每一篇推文都值得你点开长按二维码&…

回顾 | 在 GitHub 上贡献到开源项目

点击蓝字关注我们精彩回顾GitHub 是世界上最大的开源社区,拥有数百万个开源项目。GitHub 的优势之一是在项目上进行协作非常容易。在本研讨会中,我们将介绍在 GitHub 上找到开源项目并为其做出贡献的难易程度。我们将向您展示如何创建拉取请求&#xff0…

html assign无效,Object.assign的一些用法

Object.assign的一些用法2020/11/12 20:19:03  字体:大 中 小 浏览 1289 我要评论需要定制网站程序、公众号程序、微信小程序可以联系:565449214或者加微信13961347334(备注:需要技术)或者在处理一些技术问题时,有什么不懂的地…

R语言和 Python —— 一个错误的分裂

全世界有3.14 % 的人已经关注了数据与算法之美最近有一些文章提出与年龄相关的问题:“崭露头角的年轻数据科学家们是学习R语言还是Python更好?”答案似乎都是“视情况而定”,在现实中没有必要在R和Python中做出选择,因为你两个都用得到。推荐…

快速修改HTML5,HTML5无刷新修改URL(示例代码)

HTML5新添加了两个api分别是pushState和replaceState,DOM中的window对象通过window.history方法提供了对浏览器历史记录的读取,可以在用户的访问记录中前进和后退,我们可以开始操作这个历史记录堆栈。实例一、通过pushState修改URL通过这句代…

这一平台只要把握住风口期,自己就能当老板!

我是电商珠珠 短视频渐渐走进大家的视野,改变了大家的日常娱乐方式。从19年开始,抖音开始发展电商平台-抖音小店。 在改变大家娱乐方式的同时,还将直播电商的热度掀了起来,由此改变了大家的购物方式,给大家带来了方便…

如何用TensorFlow实现人工智能?

自 2015 年 11 月 9 号发布之后,TensorFlow 逐渐成为人工智能领域最广泛运用的深度学习框架。那么TensorFlow框架到底是什么?TensorFlow 是一个大规模机器学习的开源框架,提供了多种深度神经网络的支持。不仅 Google 在自己的产品线使用 Tens…

一不小心,知乎炸了!

阅读本文大概需要7分钟。昨天晚上加完班发完原创文章:如何成为一个搞垮公司的程序员?就准备回家了,突然发现知乎一堆咨询消息,看了看原来是之前回答的一个问题突然火了,就是这个:好家伙,一天不到…

[转载]Android Layout标签之-viewStub,requestFocus,merge,include

定义Android Layout(XML)时&#xff0c;有四个比较特别的标签是非常重要的&#xff0c;其中有三个是与资源复用有关&#xff0c;分别是<viewStub/>, <requestFocus />, <merge /> and<include />。可是以往我们所接触的案例或者官方文档的例子都没有着…

查询2021抚顺高考成绩,2021年抚顺高考状元是谁分数多少分,历年抚顺高考状元名单...

2020年抚顺一年一度的高考考试已经结束&#xff0c;今年抚顺高考状元是谁呢&#xff0c;抚顺高考状元出自哪个高中学校&#xff0c;文理科分数是多少分&#xff0c;一起来了解。一、2020年抚顺高考状元名单资料2020年抚顺高考状元名单和学校相关信息&#xff0c;截至目前发文时…

Android菜单详解——理解android中的Menu

前言 今天看了pro android 3中menu这一章&#xff0c;对Android的整个menu体系有了进一步的了解&#xff0c;故整理下笔记与大家分享。 PS&#xff1a;强烈推荐《Pro Android 3》&#xff0c;是我至今为止看到的最好的一本android书&#xff0c;中文版出到《精通Android 2》。 …

2021北京高考适应性测试成绩排名查询,2021届适应性考试学生成绩排名

1开启前照灯远光时仪表板上(如图所示)亮起。查看本题分析2在道路上跟车行驶时&#xff0c;跟车距离不是主要的&#xff0c;只须保持与前车相等的速度&#xff0c;即可防止发生追尾事故。查看本题分析3驾驶机动车在高速公路要按照限速标志标明的车速行驶。查看本题分析4这个标志…