REST架构

你是如何理解上网这件事的?

打开浏览器,输入网址,展现在你面前的就是一个网站了。

你可以在网站里看视频、看博客、写文章、听音乐。

但凡写过点代码的人都知道,我们平时访问的网站,其实是HTML,它不过是一个文本,只是通过渲染,在你面前变成了多姿多彩的网站。

上网这件事,其实就是把在服务器上的文本、视频、音频等资源,转化一下形式,呈现在你面前而已。

我们访问的每一个网址,都对应服务器上的一个具体资源,比如你现在看到的这篇文章,不过就是一个HTML文本而已。

这就是REST架构(Representational State Transfer),阮一峰老师翻译叫【表现层状态转化】。

我们看到的网页实际上是一个文本,状态转化一下,呈现在你面前的就是一个好看的网页了。

你点击网页上的一个按钮,网页势必有所变化,或者是打开一个新链接,或者是请求一些新的数据。

这个互动的过程,其实就是你在对服务器上的资源进行操作。

本质就好像你对自己电脑上的文件操作一样。

不信你打开文件资源管理器,输入网址,一样的能访问百度。

浏览器,实质上也是个文件资源管理器,只不过我们通常用来访问远程的资源,不然你复制一个文件夹的路径在浏览器打开试试。

你会发现浏览器其实也可以当文件资源管理器来用。

你在本地写了一个静态HTML,预览的时候,看到浏览器的链接也是这个HTML文件在你硬盘上的路径。

对RESTful API的应用

文件资源管理器上,一个文件路径代表一个文件,那么浏览器上,一个链接也代表一个资源文件。

你会在你的电脑上用动词去命名一个文件或者文件夹吗?

因此,如果遵循RESTful API,我们编写url的时候,应该都是名词,而不包含动词。

比如我们在编写【新增一个用户信息】的接口的时候,写出来的url很容易是localhost:8080/user/addUser

但其实写出来的应该是localhost:8008/users

这也是很多人的设计误区。

这样一来有人就会问了,那我增删改查,要怎么区分这些操作呢?

这些动作,可以用POST、DELETE、PUT、GET来标识。

我们就是通过这四个动作,来实现对服务器上的资源进行操作的。

同样是对用户信息进行操作,我们编写出来的接口可以是这样的:

# 获取用户列表
GET localhost:8008/users # 获取单个用户
GET localhost:8008/users/userid # 新增用户
POST localhost:8008/users # 删除指定用户
DELETE localhost:8008/users/userid # 更新用户信息
PUT localhost:8008/users/userid

不用怕链接冲突,你换了个动作,就是个新的操作。

看了上面的链接,其实也可以明白,GET代表查询,POST代表新增,DELETE代表删除,PUT则代表更新。

在RESTful架构中,每个网址代表一种资源,所有网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的"集合",所以API中的名词也应该使用复数

这样一来,我们对于编写链接,就有了个比较好的规范。

说到这里,可能说了一堆废话,毕竟有人觉得,localhost:8080/user/addUser这种写法并不影响使用,并且对很多人来说简单明了,为什么还要遵循这种看起来没什么用的API呢?

《Don't make me think》是一本讲网站设计的书,这是一本很好的书。

里面是是这么看待约束和设计的(当时觉得挺好的就摘抄下来了,不过因为时间久了,我也忘记这段话是原文摘抄还是自己编辑过了):

有一种方式看待设计——任何类别的设计,那就是,它的本质就是处理各种约束(那些你必须遵从和不能去做的事)和妥协(那些为了服从约束而做出的不够理想的选择)。

用林肯的话说,你能做到的最好的方式就是在某些时候取悦某些人。

(注:他确实说过这样的话:“你可以在所有时间欺骗一些人,或者在某些时间欺骗所有人,但你不可能在所有时间欺骗所有人。”我从互联网上学到的一件事是,如果看到某些名人名言,有92%的概率他们从没说过这些话。)

有一种成熟的主张认为,约束,与其说他们是一种负面因素,还不如说它们实际上会让设计变得更加容易,也会催生出新的创意。

的确,约束常常会帮助我们。如果需要适合放在给定的空间里,同时还需要符合给定的配色方案,实际上往往会让我们更容易找到一张这样的沙发,而不是漫无目的地寻找某张沙发。确定了某些约束会有种让注意力聚焦的效果,而一张有无限可能的空白画布——虽然它听起来是种解放——但可能会带来想法瘫痪。

RESTful API是个很好的设计原则,它约束我们只能用名词去命名url,动作只能用GET、PUT来实现,这看起来是没什么作用的规矩,但最起码,在我url多到不知道下一个url怎么写的时候,遵循这个原则,能让我更好更快地想到下一个url怎么写。

再进一步,写的url越来越多,就感觉对【上网其实是在操作服务器上的文件资源】这个本质认知更深。

一个好的设计,应该是能让我们在遵循这个设计原则的时候,不仅能提高效率,而且能让我们对事物有更好的认知。

RESTful API实践总结的更多相关文章

  1. 【转】最佳Restful API 实践

    原文转自:https://bourgeois.me/rest/ REST APIs are a very common topic nowaday; they are part of almost e ...

  2. 基于Spring Boot的RESTful API实践(一)

    1. RESTful简述    REST是一种设计风格,是一组约束条件及原则,而遵循REST风格的架构就称为RESTful架构,资源是RESTful的核心,一个好的RESTful架构,通过URL就能很 ...

  3. 通俗易懂的RESTful API实践详解(含代码)

    来源:点击进入 点击上方链接,版面更好 一.什么是RESTful REST 是面向资源的,这个概念非常重要,而资源是通过 URI 进行暴露,URI 的设计只要负责把资源通过合理方式暴露出来就可以了,对 ...

  4. RESTful API 设计最佳实践

    背景 目前互联网上充斥着大量的关于RESTful API(为了方便,以后API和RESTful API 一个意思)如何设计的文章,然而却没有一个"万能"的设计标准:如何鉴权?API ...

  5. [转]10个有关RESTful API良好设计的最佳实践

    Web API已经在最近几年变成重要的话题,一个干净的API设计对于后端系统是非常重要的. 通常我们为Web API使用RESTful设计,REST概念分离了API结构和逻辑资源,通过Http方法GE ...

  6. 10个有关RESTful API良好设计的最佳实践

    Web API已经在最近几年变成重要的话题,一个干净的API设计对于后端系统是非常重要的. 通常我们为Web API使用RESTful设计,REST概念分离了API结构和逻辑资源,通过Http方法GE ...

  7. ****RESTful API 设计最佳实践(APP后端API设计参考典范)

    http://blog.jobbole.com/41233/ 背景 目前互联网上充斥着大量的关于RESTful API(为方便,下文中“RESTful API ”简写为“API”)如何设计的文章,然而 ...

  8. RESTful API 设计最佳实践(转)

    摘要:目前互联网上充斥着大量的关于RESTful API(为了方便,以后API和RESTful API 一个意思)如何设计的文章,然而却没有一个”万能“的设计标准:如何鉴权?API格式如何?你的API ...

  9. RESTful API 设计最佳实践(转)

    背景 目前互联网上充斥着大量的关于RESTful API(为方便,下文中“RESTful API ”简写为“API”)如何设计的文章,然而却没有一个”万能“的设计标准:如何鉴权?API 格式如何?你的 ...

随机推荐

  1. 【近取 key】功能规格说明书

    目录 前置信息说明 概念介绍 记忆宫殿 A4纸背单词法 词图 单词掌握程度相关 用户和典型场景 系统功能设计 主页 词图相关功能 创建词图 查看词图 复习词图 个人控制台相关功能 我的词图 统计信息 ...

  2. CRM助力企业迎接数字化浪潮

    去年,国家发展改革委官网发布'数字化转型伙伴行动'倡议.倡议政府和社会各界联合起来,共同构建多元化的联合推荐机制,带动全行业数字化转型,构建数字化产业链,培育数字化生态,形成"数字引领.抗击 ...

  3. 测试 USB 存储设备读写性能(Mb/s),平均读写速度等

    1.将U盘(USB3.0)插入被测试机器,假定识别设备为sdc2.创建vfat文件系统分区/dev/sdb1分区容量大于30GBumount /dev/sdc1mkfs -t vfat /dev/sd ...

  4. 047.Python前端html

    一  HTTP协议 1.1 HTTP请求 URL: 协议/IP:端口/路径?GET参数 基于请求响应 请求协议格式 GET URL路径?a=1&b=2 HTTP # 请求首行 user-age ...

  5. 第35章-CentOS7实战

    补充安装软件包 yum -y install vim lrzsz bash-completion telnet nmap 关闭selinux:/etc/selinux/config 关闭防火墙:sys ...

  6. python3 smtplib发送邮件

    使用smtp包发送邮件还依赖email的一些方法 发送邮件主要分为三步: 1,定义邮箱参数:邮箱服务器地址,邮箱用户名,邮箱密码,邮件发送方,邮件接收方,邮件标题,邮件内容 2,配置发送内容 3,实例 ...

  7. Python break/continue - Python零基础入门教程

    目录 一.break 二.continue 三.重点总结 四.猜你喜欢 零基础 Python 学习路线推荐 : Python 学习目录 >> Python 基础入门 在 Python wh ...

  8. sublime使用与配置

    目录 Download Markdown转浏览器显示 1. 简单版本 2. 有MD全格式版本 Install Package Control 删除文本空行 1. Ctrl + H 2. Find \s ...

  9. 06.ElementUI 2.X 源码学习:源码剖析之工程化(一)

    0x.00 前言 在用了5章篇幅 ElementUI源码学习:从零开始搭建Vue组件库汇总 讲解了如何编写一个组件.发布npm以及生成展示文档之后.接下来将分析Element项目的代码结构,学习其工程 ...

  10. Go语言中的单例模式

    Go语言中的单例模式 在过去的几年中,Go语言的发展是惊人的,并且吸引了很多由其他语言(Python.PHP.Ruby)转向Go语言的跨语言学习者. Go语言太容易实现并发了,以至于它在很多地方被不正 ...