进入正文之前,先带着小伙伴们了解几个名词,源自百度百科。
标题中涉及的核心名词APIrestful

扩展

  • 何为API呢?

API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

  • 何为restful呢?
    restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

RESTful的关键是定义可表示流程元素/资源的对象。在REST中,每一个对象都是通过URL来表示的,对象用户负责将状态信息打包进每一条消息内,以便对象的处理总是无状态的。

Restful API

域名

应该尽量将API部署在专用域名之下。

https://api.example.com

如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下。

https://example.org/api/

版本(Versioning)

应该将API的版本号放入URL。

https://api.example.com/v1/

路径

路径又称"终点"(endpoint),表示API的具体网址。
在RESTful架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的"集合"(collection),所以API中的名词也应该使用复数。

举例来说,有一个API提供动物园(zoo)的信息,还包括各种动物和雇员的信息,则它的路径应该设计成下面这样。

https://api.example.com/v1/zoos
https://api.example.com/v1/animals
https://api.example.com/v1/employees

HTTP动词

对于资源的具体操作类型,由HTTP动词表示。
常用的HTTP动词有下面五个(括号里是对应的SQL命令)。

GET(SELECT):从服务器取出资源(一项或多项)。
POST(CREATE):在服务器新建一个资源。
PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
DELETE(DELETE):从服务器删除资源。

例如:

GET /zoos:列出所有动物园
POST /zoos:新建一个动物园
GET /zoos/ID:获取某个指定动物园的信息
PUT /zoos/ID:更新某个指定动物园的信息(提供该动物园的全部信息)
PATCH /zoos/ID:更新某个指定动物园的信息(提供该动物园的部分信息)
DELETE /zoos/ID:删除某个动物园
GET /zoos/ID/animals:列出某个指定动物园的所有动物
DELETE /zoos/ID/animals/ID:删除某个指定动物园的指定动物

过滤信息(Filtering)

如果记录数量很多,服务器不可能都将它们返回给用户。API应该提供参数,过滤返回结果。
下面是一些常见的参数。

?limit=10:指定返回记录的数量
?offset=10:指定返回记录的开始位置。
?page=2&per_page=100:指定第几页,以及每页的记录数。
?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
?animal_type_id=1:指定筛选条件

参数的设计允许存在冗余,即允许API路径和URL参数偶尔有重复。比如,GET /zoo/ID/animals 与 GET /animals?zoo_id=ID 的含义是相同的。

状态码(Status Codes)

服务器向用户返回的状态码和提示信息,常见的有以下一些(方括号中是该状态码对应的HTTP动词)。

200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。
201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。
202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
204 NO CONTENT - [DELETE]:用户删除数据成功。
400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。
401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。
406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。
410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

返回结果

针对不同操作,服务器向用户返回的结果应该符合以下规范。

GET /collection:返回资源对象的列表(数组)
GET /collection/resource:返回单个资源对象
POST /collection:返回新生成的资源对象
PUT /collection/resource:返回完整的资源对象
PATCH /collection/resource:返回完整的资源对象
DELETE /collection/resource:返回一个空文档

总结

了解上面API的理论知识之后,现在总结一下RestFulAPI规范,实际日常开发工作中主要从URL路径、HTTP请求动词、状态码和返回结果等方面详细考虑。

  • URL设计规范
    URL为统一资源定位器 ,接口属于服务端资源,首先要通过URL这个定位到资源才能去访问,而通常一个完整的URL组成由以下几个部分构成:
URI = scheme "://" host  ":"  port "/" path [ "?" query ]
  1. scheme: 指底层用的协议,如http、https、ftp
  2. host: 服务器的IP地址或者域名
  3. port: 端口,http默认为80端口
  4. path: 访问资源的路径,就是各种web 框架中定义的route路由;
    RESTful对path的设计做了一些规范,通常一个RESTful API的path组成如下:

    /{version}/{resources}/{resource_id}
    
  • version:API版本号,有些版本号放置在头信息中也可以,通过控制版本号有利于应用迭代。
  • resources:资源,RESTful API推荐用小写英文单词的复数形式。
  • resource_id:资源的id,访问或操作该资源。
  1. query: 查询字符串,为发送给服务器的参数,在这里更多发送数据分页、排序等参数。

对于RESTful API的URL具体设计的规范如下:
1.不用大写字母,所有单词使用英文且小写。
2.连字符用中杠"-“而不用下杠”_"
3.正确使用 “/“表示层级关系,URL的层级不要过深,并且越靠前的层级应该相对越稳定
4.结尾不要包含正斜杠分隔符”/”
5.URL中不出现动词,用请求方式表示动作
6.资源表示用复数不要用单数
7.不要使用文件扩展名

【Restful】你还不懂Restful API规范吗?相关推荐

  1. RESTful API 规范

    REST 和 RESTfulAPI REST是REpresentational State Transfer表述性状态转移 的首字母缩写,是一种基于超媒体构建分布式系统的架构风格.与其他架构风格一样, ...

  2. php restful规范,RESTFul API规范 详细指南

    RESTFul规范 RESTFul是一种HTTP API接口规范,只要满足的RESTFul规范,即可称为RESTFul API. 既然是接口,我们先来了解一下,他和传统的API接口有何不同吧. 本文以 ...

  3. 花5分钟看这篇之前,你才发现你不懂RESTful

    前言 在学习RESTful 风格接口之前,即使你不知道它是什么,但你肯定会好奇它能解决什么问题?有什么应用场景?听完下面描述我想你就会明白: 在互联网并没有完全流行的初期,移动端也没有那么盛行,页面请 ...

  4. 花五分钟看这篇之前,你才发现你不懂RESTful

    原创公众号(希望能支持一下):bigsai 转载请联系bigsai 文章收藏在回车课堂 和github 前言 在学习RESTful 风格接口之前,即使你不知道它是什么,但你肯定会好奇它能解决什么问题? ...

  5. restful和rest_HATEOAS的RESTful服务:JVM上的REST API和超媒体

    restful和rest 1.简介 到目前为止,我们已经花了很多时间谈论了相当数量的关于角色的的超媒体和HATEOAS在REST风格的 Web服务和API,扫视不同规格和可用性方面. 听起来好像支持超 ...

  6. 通俗易懂RESTful,如何设计RESTful风格API

    REST – REpresentational State Transfer 直译:表现层状态转移.这个中文直译经常出现在很多文章中.尼玛,谁听得懂"表现层状态转移",这是人话吗? ...

  7. django restful 请求_Django编写RESTful API(二):请求和响应

    前言 在上一篇文章,已经实现了访问指定URL就返回了指定的数据,这也体现了RESTful API的一个理念,每个URL表明着一个资源.固然咱们还知道RESTful API的另外一个特性就是,发送不一样 ...

  8. 【接口文档】Django restful framework中自动生成API文档

    Django restful framework中自动生成API文档 一.Swagger概述 1.引言 当接口开发完成,紧接着需要编写接口文档.传统的接口文档使用Word编写,or一些接口文档管理平台 ...

  9. 什么是restful?说说你对restful的理解

    目录 什么是restful?说说你理解的restful APIview里如何获取http里的数据? 为什么APIview里获取的数据可以直接当做字典操作? 什么是restful?说说你理解的restf ...

最新文章

  1. 电信运营商 IT 系统介绍
  2. mysql 自后向前截取函数_【转载】Sqlserver使用Right函数从最右边向前截取固定长度字符串...
  3. 使用Spring3+Quartz实现定时任务
  4. linux下成功安装ffmpeg( 亲测有效 )
  5. GCC/G++编译过程
  6. javascript 校验 非空_前端(js+JQuery非空校验)
  7. ideaIU--2018.2.2安装教程
  8. 数据流图(DFD)概念及画法
  9. 机器学习第六课part1(最小二乘,L1,L2正则)
  10. Kafka中zookeeper的作用详解(7点)
  11. 科学减肥新方法——红光光浴#大健康#红光光浴#红光#种光光学
  12. ElasticSearch(项目中常用的ES)
  13. 公众号图文消息加html,微信公众号图文排版,如何给文章或者段落添加背景图?...
  14. 低延时应用 服务器TurboBoost不可得兼?
  15. Transformer 新型神经网络在机器翻译中的应用
  16. 机器学习1:泛化(过拟合、欠拟合)
  17. 高可用架构之限流降级
  18. php 用pdf转html,在PHP中将PDF转换为HTML,类似于DocuSign
  19. 在杭州的程序员帮下忙啊,刚毕业准备去杭州就业,问下情况
  20. 代码随想录训练营day33

热门文章

  1. MyEclipse下连接Mysql
  2. VMWARE VICLIENT实现虚拟机独立管理
  3. 真正中文攻略之ef - the first tale(含下载和汉化)
  4. 职场七种最致命的想法
  5. Java中哪些可以作为GC Roots
  6. 天猫精灵 python_python爬天猫
  7. lnmp 安装php扩展fileinfo.so
  8. Bootstrap研究2-布局系统杂记
  9. java代码中出现乱码怎么解决?
  10. 面向文档的NoSQL数据库MongoDB