技术由来:

互联网早期,页面请求和并发量不高,且移动端未盛行时对接口要求不高,使用动态页面(jsp)就能满足绝大多数的使用需求。但是随着互联网和移动设备的发展,人们对Web应用的使用需求也增加,传统的动态页面由于低效率而渐渐被HTML+JavaScript(Ajax)的前后端分离所取代,并且安卓、IOS、小程序等形式客户端层出不穷,客户端的种类出现多元化,而客户端和服务端就需要接口进行通信,但接口的规范性就又成了一个问题:

所以一套结构清晰、符合标准、易于理解、扩展方便让大部分人都能够理解接受的接口风格就显得越来越重要,而RESTful风格的接口(RESTful API)刚好有以上特点,就逐渐被实践应用而变得流行起来。

使用resetful设计的接口特点:看Url就知道要什么资源数据,看http method就知道进行什么操作!

所以RESTful API就是一套接口设计风格,用来规范多种形式的前端和同一个后台的交互方式

使用场景:

前后端分离。前端拿到数据只负责展示和渲染,不对数据做任何处理。后端处理数据并以JSON格式传输出去,定义这样一套统一的接口,在web,ios,android三端都可以用相同的接口,节约开发成本以及便于同一调试。

区分REST和RESTful :

REST是几个单词缩写 -- REpresentational State Transfer 直接翻译:表现层状态转移。字面理解太复杂了,先简单理解为:URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作。

REST描述的是在网络中client和server的一种交互形式;REST并没有一个明确的标准,而更像是一种设计的风格,满足这种设计风格的程序或接口我们称之为RESTful(从单词字面来看就是一个形容词)。所以RESTful API 就是满足REST架构特征的接口。

REST架构特征和设计规范:

  • URI指向资源:使用URI = Universal Resource Identifier 统一资源标志符,用来标识抽象或物理资源的一个紧凑字符串。URI包括URL和URN,在这里更多时候可能代指URL(统一资源定位符)。RESTful是面向资源的,每种资源可能由一个或多个URI对应,但一个URI只指向一种资源。注意:使用名词的复数表示一个资源集合,如api.domain.com/users;使用斜线“/”用来表示资源之间的层次关系,如api.domain.com/users/1234/orders;URI 中应尽量使用小写字母,不实用下划线;URL末尾不应包含斜线“/”;
  • 统一接口: 通过一定原则设计接口降低耦合,简化系统架构,这是RESTful设计的基本出发点。对资源的操作包括获取、创建、修改和删除,这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法。换言而知,使用RESTful风格的接口但从接口上你可能只能定位其资源,但是无法知晓它具体进行了什么操作,需要具体了解其发生了什么操作动作要从其HTTP请求方法类型上进行判断。具体的HTTP方法和方法含义如下图1,这样就统一了数据操作的接口。

非RESTful风格的API中,我们通常使用GET请求和POST请求完成增删改查以及其他操作,查询和删除一般使用GET方式请求,更新和插入一般使用POST请求。从请求方式上无法知道API具体是干嘛的,所有在URL上都会有操作的动词来表示API进行的动         作,例如:query,add,update,delete等等。而RESTful风格的API则要求在URL上都以名词(推荐用复数)的方式出现,从几种请求方式上就可以看出想要进行的操作,这点与非RESTful风格的API形成鲜明对比。在谈及GET,POST,PUT,DELETE的时候,就必须提一下接口的安全性和幂等性,其中安全性是指方法不会修改资源状态,即读的为安全的,写的操作为非安全的。而幂等性的意思是操作一次和操作多次的最终效果相同,客户端重复调用也只返回同一个结果。

上述四个HTTP请求方法的安全性和幂等性如下:

    举例子:说了这么多,到底RESTful长什么样子的呢?

  • GET:http://www.xxx.com/source/id 获取指定ID的某一类资源。
  • 例如GET:http://www.xxx.com/friends/123表示获取ID为123的会员的好友列表。如果不加id就表示获取所有会员的好友列表。
  • POST:http://www.xxx.com/friends/123表示为指定ID为123的会员新增好友。其他的操作类似就不举例了。

 如果一个操作无法对应到资源的某个操作上,此时可以适当地在URI中包含动词,但依然应该基于一个资源的标识符。例如:DELETE /users/1234/set-admin

  • 无状态。服务器不能保存客户端的信息, 每一次从客户端发送的请求中,要包含所有必须的状态信息,会话信息由客户端保存, 服务器端根据这些状态信息来处理请求。 当客户端可以切换到一个新状态的时候发送请求信息, 当一个或者多个请求被发送之后, 客户端就处于一个状态变迁过程中。 每一个应用的状态描述可以被客户端用来初始化下一次的状态变迁。
  • 状态码和返回数据

服务端处理完成后客户端也可能不知道具体成功了还是失败了,服务器响应时,包含状态码返回数据两个部分。

{  //响应格式status:0,data:{}||[],msg:’’
}
  • 过滤信息:可以使用过滤信息进行筛选、搜索或分页查询等

  • 可缓存性(Cacheability) :服务端需回复是否可以缓存以让客户端甄别是否缓存提高效率。
  • 版本号:可以将API的版本号放入URL。GET:http://www.xxx.com/v1/friend/123。或者将版本号放在HTTP头信息中。

总结:

RESTful风格的API 固然很好很规范,但大多数互联网公司并没有按照或者完全按照其规则来设计,因为REST是一种风格,而不是一种约束或规则,过于理想的RESTful API 会付出太多的成本。

比如RESTful API也有一些缺点

  • 比如操作方式繁琐,RESTful API通常根据GET、POST、PUT、DELETE 来区分操作资源的动作,而HTTP Method 本身不可直接见,是隐藏的,而如果将动作放到URL的path上反而清晰可见,更利于团队的理解和交流。
  • 并且有些浏览器对GET,POST之外的请求支持不太友好,还需要特殊额外的处理。
  • 过分强调资源,而实际业务API可能有各种需求比较复杂,单单使用资源的增删改查可能并不能有效满足使用需求,强行使用RESTful风格API只会增加开发难度和成本。

所以,当你或你们的技术团队在设计API的时候,如果使用场景和REST风格很匹配,那么你们可以采用RESTful 风格API。但是如果业务需求和RESTful风格API不太匹配或者很麻烦,那也可以不用RESTful风格API或者可以借鉴一下,毕竟无论那种风格的API都是为了方便团队开发、协商以及管理,不能墨守成规。

参考学习文章:

https://www.toutiao.com/i6693727878158221836/

https://www.toutiao.com/a6902604637149692428/

restful api接口设计相关推荐

  1. API接口设计之RESTful软件架构风格

    说到API接口设计有的喜欢用Web Service,有的喜欢用WCF,当然也有还在用最原始的ashx,aspx页面的.无论采用什么方式能很好的满足业务需求就ok,但是不同的方式在扩展性.易用性,可维护 ...

  2. RESTful API接口基本内容

    RESTful API接口基本内容 目录 RESTful API接口基本内容 一.RESTful是什么? 1.1.基本特点 1.2.设计概念和准则 1.3.http协议 二.RESTful与SOAP ...

  3. 16. 设计模式之契约原则:如何做好 API 接口设计?

    一.契约式设计原则:API 设计的指导书 无论是架构设计还是编码实现,现在都越来越离不开接口设计,接口可以说是新时代的"集装箱",是得到了几乎所有人一致共识的通用标准. GoF 在 ...

  4. Restful API是什么?初探Restful API,传统接口写法与Restful API接口写法区别

    Restful API是什么?初探Restful API?为什么要用Restful API?传统接口写法与Restful API接口写法区别,带着这些问题我们来具体了解下Restful API: 目录 ...

  5. RESTful API接口设计规范

    目录 一.RESTful的诞生背景 二.什么是RESTful? 三.Restful API接口设计规范 3.1.协议 3.2.路径规则|域名 3.3.版本控制 3.4.请求类型 3.5.传入参数 3. ...

  6. RESTful API的设计原则

    说在前面,这篇文章是无意中发现的,因为感觉写的很好,所以翻译了一下.由于英文水平有限,难免有出错的地方,请看官理解一下.翻译和校正文章花了我大约2周的业余时间,如有人愿意转载请注明出处,谢谢^_^ P ...

  7. API接口设计最佳实践

    目录 目录 前言 API接口设计 Token设计 API接口设计原则 1.明确协议规范 2.统一接口路径规范 3.统一接口版本管理 4.为你的接口设定调用门槛 5.接口返回规范 6.接口安全规范 7. ...

  8. Eggjs笔记:RESTful API的设计

    关于RESTful API 网络应用程序,分为前端和后端两个部分.当前的发展趋势,就是前端设备层出不穷(手机.平板.桌面电脑.其他专用设备-). 因此,必须有一种统一的机制,方便不同的前端设备与后端进 ...

  9. 整合swagger2生成Restful Api接口文档

    整合swagger2生成Restful Api接口文档 swagger Restful文档生成工具 2017-9-30 官方地址:https://swagger.io/docs/specificati ...

最新文章

  1. shell中字符串基本用法
  2. android java内存 c内存_Android NDK java和C\C++交互 | 学步园
  3. Hbase的基于快照的表修复
  4. iphone连不上微软服务器,windows没法连接到iphone是什么意思
  5. Java写txt—读txt—清空txt文件
  6. linux把m4s格式转换mp4,video - ffmpeg将m4s转换为mp4 - SO中文参考 - www.soinside.com
  7. 计算机专业英语prototype,[听单词] 计算机专业英语词汇音频72,计算机英语单词MP3...
  8. 对缓存投毒的学习总结
  9. 2010年3月份中国物流与采购联合会发布中国制造业采购经理指数为55.1%
  10. 【数据结构】循环队列的front,rear指针以及队列满的条件、计算队列长度
  11. 共模干扰以及共模干扰消除方法
  12. flask返回本地文件到服务器,Flask返回静态文件
  13. Python 从入门到放弃(三)
  14. 血污夜之仪式秘密巫师实验室收集策略
  15. python 多任务
  16. 保护云端数据安全的方法,主要有哪几种?
  17. 如何添加共享计算机用户,如何正确设置共享
  18. 一天 第一章 花在花苞未有泪,人见不识无言对
  19. 看了这篇文章CAP你还不懂,我打你!
  20. 0-5V转4-20mA的几种实现方法

热门文章

  1. 服务器oracle优化,oracle服务器配置及优化
  2. [转载] Java静态绑定与动态绑定
  3. java gc的特性_Java12新特性 -- 可中断的G1 Mixed GC
  4. python动态方法_python中的动态方法生成
  5. 在Python中使用OpenCV裁剪图像
  6. scala 函数中嵌套函数_如何在Scala中将函数转换为部分函数?
  7. java 根据类名示例化类_Java LocalDateTime类| AdjustInto()方法与示例
  8. c# 操作IIS应用程序池
  9. Oracle 练习P297 131026 PL/SQL块程序
  10. Python实现GCS bucket断点续传功能,分块上传文件