来源:蜗牛互联网

记得大学搞编程的时候,比起研究数据结构,做算法题,我更喜欢搞 web 编程。因为做 web 是可以通过浏览器快速看到效果的,可视化的页面也能带给自己满足感。

我画了个图,读者朋友可以感受下,自己作为用户,请求自己代码编出来的页面,岂不是很有成就感?

如果你作为用户来访问互联网资源,那么大概的过程是这样的:你在浏览器是录入  URL 或者点击一个超链接后,浏览器会请求 DNS 服务器解析这个 URL,返回域名映射的IP,然后通过 HTTP 请求这个 IP 对应的 web 资源,如果涉及到一些数据的查询,还会访问数据库服务器获取数据,然后把数据返回,web 服务器将数据和样式处理下,转成 web 资源,然后返回给浏览器,经过浏览器的渲染,你就能看到可视化的页面了。

但那时搞 web 编程还比较麻烦,什么 JSP,ASP,前端代码和后端代码杂糅在一起,就这么你离不开我我离不开你似的在 web 服务器上跑着,代码看上去不清爽,很多业务逻辑也没法被其它站点复用。

假设现在有三个巨头企业,他们分别维护 baitu.com,kk.com,taopao.com 三个站点,这些站点向服务端的交互都是通过 JavaScript 客户端实现的。某一天三家合并了,那就会涉及很多业务互通,比如 baitu.com 站点下想访问 kk.com 的一些数据。

这时候该怎么做呢?过去通用的解法是用 SOAP(Simple Object Access Protocol,简单对象访问协议),这是一种基于 XML 格式以及 HTTP 传输方式的数据交换协议。

前端 JavaScript 是不能直接访问 SOAP 服务的,需要先访问到 baitu.com 对应的网站后台,然后由网站后台去访问 kk 提供的 SOAP 服务(要在之前网站后台直接访问数据库的逻辑上,抽取单独的服务层出来),然后再由 baitu.com 的网站后台对返回的数据进行渲染,将 HTML 等资源信息返回给前端。

那么这时候问题就来了,我在 baitu.com 上的一个前端页面上,一旦想加点 kk 才有的数据,我就必须得改 baitu.com 的网站后台,并且要重新接入 kk 提供的 soap 服务。这显然是一种低效的架构方式,相当影响研发效率。

那么有没有一种方式,我不需要经过 baitu 的网站后台,直接就能访问到 kk 的服务呢?页面上业务逻辑的处理,就不要放网站后台了,在 JavaScript 的客户端直接做掉,通过访问后端的某种服务获得业务处理的结果,然后基于网站后台存放的 HTML 和 CSS 来渲染页面。

就像图示的这样,baitu 的 JavaScript 客户端就做两件事,访问后端服务获取业务逻辑处理的结果数据,将数据以 网站后台存放的 HTML 和 CSS 的要求展示出来。这样看来,网站后台就像个壳,只负责本站的 HTML、CSS 和 JavaScript 等静态资源,相关的业务逻辑处理就交给服务来提供。

这就是前后端分离的思想,前端静态资源和后端动态服务解耦。前端只关心 HTML 等前端代码,不涉及一行后端代码,后端只关心自己提供的服务,不涉及一行前端代码。

在这种思想的指引下,SPA(single page web application,单页面应用)就出现了。SPA 是单个 HTML 页面的 Web 应用程序,它在用户与应用程序交互时由 JavaScript 动态更新页面。其工作原理如图。

浏览器客户端一开始会加载必需的 HTML、CSS 和 JavaScript,之后的所有的操作都在这张页面上完成,由 JavaScript 来控制,通过某种数据格式和服务端产生交互,获取返回结果。

这个时候,客户端就需要服务端提供的业务服务得是一个 API(应用程序访问接口),客户端可以直接发起请求,这时候 REST API 就派上用场了。

什么是 REST 呢?

REST 是 REpresentational State Transfer(表述性状态转移) 的首字母缩写,这名字什么鬼?好难理解的样子,不过它本身就源于国外一个博士的论文,论文嘛,大家都知道的,一般不太好理解。我这里画了个图,通过分拆的方式,帮助大家理解下:

REST 是一种设计思想,它的核心是资源,可以理解成在 REST 的世界里,万物皆资源。

  • REpresentational(表述性):这是个形容词,它想要表达的意思是,资源可以用各种形式来进行表述,无论是 XML、JSON 还是 HTML,只要适合资源使用者,任何形式都可以。

  • State(状态):这是个名词,也是 REST 思想的本质。它告诉开发者,REST 关注的是资源当前的状态,而不是对资源采取的行为。无论资源的形式如何变化,它要表达的内容其实是统一的,该资源存在还是不存在,单个信息还是多个信息,都有哪些属性,这就是资源的状态。

  • Transfer(转移):这是个动词,它指转移资源,以某种表述性形式资源从一个应用转移到另一个应用。转移过程中,资源状态可能会有所变化。

在 REST 中,资源是通过 URL 进行识别和定位的。对资源的操作,是通过 HTTP 方法来定义的。HTTP 方法一般会映射到数据层的 CRUD 动作:

数据层动作 HTTP 方法 描述
Create POST 新建资源
Read GET 获取资源
Update PUT 或 PATCH 更新资源
Delete DELETE 删除资源

此映射不是严格限制,读者朋友可以根据实际情况灵活映射。

比如很多网站会维护用户的个人资料信息,如果用 REST 来设计相关操作的 API,可以这么设计:

操作项 URL HTTP 方法
新增个人资料 http://api.example.com/profile POST
查询个人资料 http://api.example.com/profile GET
修改个人资料 http://api.example.com/profile PUT
删除个人资料 http://api.example.com/profile DELETE

简单讲,REST 就是 URL 定位资源,HTTP 方法操作资源

REST 的出现是对过去编程模式的重大颠覆,除了架构上客户端和服务端的解耦,前后端各司其职,也极大提升了开发团队的研发效率。希望我在编程模式上的变化和思考能对你有所启发。



推荐阅读:哈哈哈…发现微信一个bug!有点好玩~知乎高赞:拼多多和国家电网,选哪个?注意!某知名国产软件被曝携带木马病毒戳「阅读原文」,查看上期精彩文章!

我是如何放弃 JSP,转向 REST 编程的相关推荐

  1. 资深程序员建议放弃 JSP 吧,否则你可能“无路可走”!

    >>号外:关注"Java精选"公众号,菜单栏->聚合->干货分享,回复关键词领取视频资料.开源项目. 自从在知乎回答问题以来,以及根据最近几年给企业做技术咨 ...

  2. python语言的生态库都是官方开发的_放弃Python转向Go语言:我们找到了以下9大理由...

    原标题:放弃Python转向Go语言:我们找到了以下9大理由 转用一门新语言通常是一项大决策,尤其是当你的团队成员中只有一个使用过它时.今年 Stream 团队的主要编程语言从 Python 转向了 ...

  3. 阿里云 刷新缓存 java_【从入门到放弃-Java】并发编程-NIO-Buffer

    前言 上篇[从入门到放弃-Java]并发编程-NIO-Channel中我们学习到channel是双向通道,数据通过channel在实体(文件.socket)和缓冲区(buffer)中可以双向传输. 本 ...

  4. 操作系统锁的实现方法有哪几种_「从入门到放弃-Java」并发编程-锁-synchronized...

    简介 上篇[从入门到放弃-Java]并发编程-线程安全中,我们了解到,可以通过加锁机制来保护共享对象,来实现线程安全. synchronized是java提供的一种内置的锁机制.通过synchroni ...

  5. 【渝粤题库】陕西师范大学164111 Java及JSP动态网页编程与应用 作业 (高起专)

    <JAVA与JSP动态网页编程与应用>作业 一.单选题 1.以下哪项都是关键字( ) A.package privati protect throw B. false final fina ...

  6. 【从入门到放弃-Java】并发编程-锁-synchronized

    简介 上篇[从入门到放弃-Java]并发编程-线程安全中,我们了解到,可以通过加锁机制来保护共享对象,来实现线程安全. synchronized是java提供的一种内置的锁机制.通过synchroni ...

  7. 【从入门到放弃-Java】并发编程-NIO-Channel

    前言 上篇[[从入门到放弃-Java]并发编程-NIO使用]()简单介绍了nio的基础使用,本篇将深入源码分析nio中channel的实现. 简介 channel即通道,可以用来读.写数据,它是全双工 ...

  8. 【从入门到放弃-Java】并发编程-NIO-Buffer

    前言 上篇[从入门到放弃-Java]并发编程-NIO-Channel中我们学习到channel是双向通道,数据通过channel在实体(文件.socket)和缓冲区(buffer)中可以双向传输. 本 ...

  9. 我是如何放弃投行回归技术的

    放弃伦敦巴克莱银行那份薪水稳定的交易员职位后,我加入了印度一家行业领先的科技创业公司,于是很多朋友都问我同一个问题: "为什么把高薪体面的工作放一边,跑回来做技术的老本行呢?" 每 ...

最新文章

  1. 人体姿态估计研究文集
  2. java结构设计_Java基本的程序设计结构(一)
  3. 特斯拉股价创新高 马斯克嘚瑟:股价真高 哈哈!
  4. Linux之nc命令
  5. 2步判断晶体管工作状态
  6. oracle ora-22992,ORACLE ORA--22992:无法使用远程表选择的LOB定位器,database link
  7. js开源框架最新版下载
  8. 智能机器人机器人心得_如果机器人说到上帝
  9. mysql的索引(一)
  10. 彻底卸载SQL2005记录
  11. 企业数字化信息化运营管理规划方案
  12. linux 不工作,Ubuntu用户Steam控制器不工作解决办法
  13. 腾讯校园招聘--一面(技术1对1)面经
  14. 图文详解win7声音图标不见了怎么办
  15. 华为 Mate40系列发布,你的5G绝版手机来了!
  16. 简单枚举(ZJM要抵御宇宙射线)
  17. 【2022小米秋招(2023校招)】软件开发方向 笔试题1——链表反转
  18. 专业python培训报价多少
  19. Subversion commit log 自動寄信通知
  20. 步态能量图 matlab,【计算机视觉】步态能量图GEI

热门文章

  1. 读书笔记写法--怎么做读书笔记
  2. 无盘网吧服务器能带30台机吗,30台机无盘网吧的配置方案
  3. phpqrcode生成二维码直接输出(不用exit)
  4. 中国青年教师跌入“社会底层”?同一高校收入差距巨大
  5. linux挂载光盘的命令,Linux系统下挂载光盘的教程
  6. 机器学习与计算机视觉入门项目——视频投篮检测(一)
  7. 折800首页的静态页面
  8. 儿童台灯哪个品牌更护眼推荐?四款眼科专家推荐的护眼台灯
  9. 从双非到专业排名前三的C9高校的申博历程
  10. 机器学习面试知识点总结(更新中...)