网络应用程序,分为前端和后端两个部分。当前的发展趋势,就是前端设备层出不穷(手机、平板、桌面电脑、其他专用设备......)。因此,必须有一种统一的机制,方便不同的前端设备与后端进行通信。这导致API构架的流行,甚至出现"API First"的设计思想。
RESTful API是目前比较成熟的一套互联网应用程序的API设计理论

RESTful API的相关规定

一、协议
API与用户的通信协议,总是使用HTTPs协议

二、域名
应该尽量将API部署在专用域名之下
https://api.example.com
如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下
https://example.org/api/

三、版本(Versioning)
应该将API的版本号放入URL
https://api.example.com/v1/

四、路径(Endpoint)----说白了就是url,每一个资源都有一个url与之一一对应
路径又称"终点"(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):从服务器删除资源。
还有两个不常用的HTTP动词
HEAD:获取资源的元数据。
OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。

下面是一些例子
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)---其实就是在url中增加一些参数,视图函数通过获取这些关键字而做一些相应的动作
如果记录数量很多,服务器不可能都将它们返回给用户。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 的含义是相同的。
(就是不同的url形式)

七、状态码(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 - [*]:服务器发生错误,用户将无法判断发出的请求是否成功

八、错误处理(Error handling)
如果状态码是4xx,就应该向用户返回出错信息。一般来说,返回的信息中将error作为键名,出错信息作为键值即可。
{
error: "Invalid API key"
}

九、返回结果
针对不同操作,服务器向用户返回的结果应该符合以下规范
GET /collection:返回资源对象的列表(数组)
GET /collection/resource:返回单个资源对象
POST /collection:返回新生成的资源对象
PUT /collection/resource:返回完整的资源对象
PATCH /collection/resource:返回完整的资源对象
DELETE /collection/resource:返回一个空文档

十、Hypermedia API
RESTful API最好做到Hypermedia,即返回结果中提供链接,连向其他API方法(连接其他资源的url),使得用户不查文档,也知道下一步应该做什么
比如,当用户向api.example.com的根目录发出请求,会得到这样一个文档
{"link":
{
"rel": "collection https://www.example.com/zoos",
"href": "https://api.example.com/zoos",
"title": "List of zoos",
"type": "application/vnd.yourformat+json"
}
}
上面代码表示,文档中有一个link属性,用户读取这个属性就知道下一步该调用什么API了。
rel表示这个API与当前网址的关系(collection关系,并给出该collection的网址),
href表示API的路径,title表示API的标题,type表示返回类型。

Hypermedia API的设计被称为HATEOAS。Github的API就是这种设计,访问api.github.com会得到一个所有可用API的网址列表
{
"current_user_url": "https://api.github.com/user",
"authorizations_url": "https://api.github.com/authorizations",
// ...
}

从上面可以看到,如果想获取当前用户的信息,应该去访问api.github.com/user,然后就得到了下面结果
{
"message": "Requires authentication",
"documentation_url": "https://developer.github.com/v3"
}
面代码表示,服务器给出了提示信息,以及文档的网址

十一、其他
(1)API的身份认证应该使用OAuth 2.0框架。
(2)服务器返回的数据格式,应该尽量使用JSON,避免使用XML。

补充知识点:
使用Http头声明序列化格式
在客户端和服务端,双方都要知道通讯的格式,格式在HTTP-Header中指定
Content-Type 定义请求格式
Accept 定义系列可接受的响应格式

实际操作中的一些事项

前后端完全分离后,前端和后端如何交互?答:通过双方协商好的API

定义json结构
JSON 结构
requestParams:

{
}
responseBody:

{
"meta": {
},
"data": {
}
}

meta 中封装操作成功或失败的消息,data 中封装返回的具体数据
当新建商品或更新产品时,相关属性封装在 JSON 中,通过 POST 或 PUT 发送
{
"name": "Apple Watch SPORT",
"description": "Sport 系列的表壳材料为轻巧的银色及深空灰色阳极氧化铝金属,强化 Ion-X 玻璃材质为显示屏提供保护。
搭配高性能 Fluoroelastomer 表带,共有 5 款缤纷色彩。"
}
当用户对商品进行操作后,将得到响应结果。GET, POST, PUT 操作成功,返回如下结果
{
"meta": {
"code": 201,
"message": "创建成功"
},
"data": {
"id": "5308e9c2-a4ce-4dca-9373-cc1ffe63d5f9",
"name": "Apple Watch SPORT",
"description": "Sport 系列的表壳材料为轻巧的银色及深空灰色阳极氧化铝金属,强化 Ion-X 玻璃材质为显示屏提供保护。
搭配高性能 Fluoroelastomer 表带,共有 5 款缤纷色彩。"
}
}

DELETE 操作成功,返回如下结果
{
"meta": {
"code": 204,
"message": "删除成功"
}
}

转载于:https://www.cnblogs.com/potato-chip/p/9031808.html

restfull知识点相关推荐

  1. Openstack面试题和知识点总结

    文章目录 知识点 云计算 起源 定义 特点 分类 服务类型 平台分类 应用 虚拟化 虚拟化技术 定义 分类 云计算和虚拟化的关系 虚拟化的优点 OpenStack 简介 核心架构 Openstack组 ...

  2. Java架构师,大数据架构师,高并发设计模式,机器学习知识点分享

    第一章:java精品课程目录大全 1.亿级流量电商详情页系统的大型高并发与高可用缓存架构实战 1课程介绍以及高并发高可用复杂系统中的缓存架构有哪些东西?32分钟 2基于大型电商网站中的商品详情页系统贯 ...

  3. 解释型语言与编译型的必须知识点

    解释型语言与编译型的必须知识点 概念: 计算机不能理解直接理解高级语言,只能理解机器语言,所以必须把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序. 翻译的方式有两种: 编译 解释 两种翻译 ...

  4. YOLOV4知识点分析(二)

    YOLOV4知识点分析(二) 数据增强相关-mixup 论文名称:mixup: BEYOND EMPIRICAL RISK MINIMIZATION 论文地址:https://arxiv.org/ab ...

  5. YOLOV4知识点分析(一)

    YOLOV4知识点分析(一) 简 介 yolov4论文:YOLOv4: Optimal Speed and Accuracy of Object Detection arxiv:https://arx ...

  6. 你需要掌握的有关.NET DateTime类型的知识点和坑位 都在这里

    引言    DateTime数据类型是一个复杂的问题,复杂到足以让你在编写[将日期从Web服务器返回到浏览器]简单代码时感到困惑. ASP.NET MVC 5和 Web API 2/ASP.NETCo ...

  7. 简练软考知识点整理-范围确认易混概念

    与确认范围容易混淆的知识点包括,确认范围与核实产品.质量控制.项目收尾,下面进行比较分析. (1)确认范围与核实产品 核实产品是针对产品是否完成,在项目(或阶段)结束时由发起人或客户来验证,强调产品是 ...

  8. 朴素贝叶斯知识点概括

    1. 简述 贝叶斯是典型的生成学习方法 对于给定的训练数据集,首先,基于特征条件独立假设,学习输入/输出的联合概率分布:然后,基于此模型,对于给定的输入x,根据贝叶斯定理求后验概率最大的输出y 术语说 ...

  9. 计算机二级函数知识,2017年全国计算机二级考试MS Office高级应用知识点:INDIRECT函数...

    INDIRECT函数知识点 适用考试:全国计算机二级考试 考试科目:MS Office高级应用 科目知识点:INDIRECT函数 INDIRECT函数立即对引用进行计算,并显示其内容.当需要更改公式中 ...

最新文章

  1. 《OpenCV3编程入门》学习笔记2 启程前的认知准备
  2. Redis的rdb格式学习
  3. 高颜值性价比神器,乐Pro3双摄AI版带来不一样的上手体验
  4. 【公开课】“有三说深度学习”上线
  5. 解决hibernate双向关系造成的一方重复执行SQl,或者死循环的问题
  6. WIN10安装和使用MySql5.6中遇到的一些问题与解决
  7. c+mysql主从切换_mysql主从配置
  8. Redis 经典 必问21问,BAT面试都会问,你会回答吗?
  9. PHPExcel 导出带生成图片完美案例
  10. GEE(Google Earth Engine)批量导入谷歌云盘
  11. 跨时钟域处理所用到的同步器
  12. 编程实现幂函数,(指数为整数)
  13. 微信号注册又将有新规定了
  14. java让星星闪烁,js实现星星闪特效
  15. Mac系统切换SMB账号密码
  16. 利用随机数函数掷骰子
  17. js-xlsx vue导入excel在线预览
  18. android微信列表滑动删除,Android仿微信对话列表滑动删除效果
  19. 软工复习一万字资料大全总结超强无敌版稳过乱过
  20. Python当中华氏度和摄氏度转换

热门文章

  1. input点击事件不能用_用js简单写一个计算器
  2. java深拷贝和浅拷贝介绍
  3. java 测试工具 oracle_几种测试工具的简单介绍
  4. linux安装mysql不成功怎么处理_Linux上安装MySQL时出现不兼容的解决办法
  5. 后端技术:ELK不香了?企业级日志平台新框架 Graylog介绍
  6. 电脑维修:电脑故障通用处理思路,你有必要了解一下!
  7. 计算机网络必备知识,非常全面!
  8. 盘点阿里程序员常用的 15 款开发者工具
  9. 20 个最常用的 Git 命令用法说明及示例
  10. 教你十分钟构建好 SpringBoot + SSM 框架