Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >RESTful API的十个最佳实践1. 使用名词而不是动词 2. Get方法和查询参数不应该改变资源状态3. 使用名词的复数形式 4. 为关系使用子资源 5. 使用HTTP头决定序列化格式 6. 使

RESTful API的十个最佳实践1. 使用名词而不是动词 2. Get方法和查询参数不应该改变资源状态3. 使用名词的复数形式 4. 为关系使用子资源 5. 使用HTTP头决定序列化格式 6. 使

作者头像
小白哥哥
发布于 2018-03-07 06:49:50
发布于 2018-03-07 06:49:50
2.9K00
代码可运行
举报
文章被收录于专栏:技术小讲堂技术小讲堂
运行总次数:0
代码可运行

WebAPI在过去几年里非常的盛行,我们很多以往的技术手段都慢慢的转换为使用WebAPI来开发,因为它的语法简单规范化,以及轻量级等特点,这种方式收到了广泛的推崇。

通常我们使用RESTFul(Representational State Transfer)的设计方式来设计Web api,这通常用来分离API结构了业务逻辑,它使用典型的HTTP方法,诸如GET,POST.DELETE,PUT来和资源进行交互。

以下是设计RESTful API的是个最佳实践:

1. 使用名词而不是动词

为了易于理解,为资源使用下面的API结构:

Resource

Getread

Postcreate

Putupdate

Delete

/cars

返回一个car的列表

创建一个新的car

更新car的信息

删除所有的car

/cars/2

返回指定的car

Method not allowed(405)

更新指定的car的信息

删除指定的car

不要使用动词

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/getAllCars
/createNewCar
/deleteAllRedCars

2. Get方法和查询参数不应该改变资源状态

使用Put,Post和Delete方法替代Get方法来改变资源状态。不要使用Get来使状态改变:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /users/711?activate or
GET /users/711/activate

3. 使用名词的复数形式

不要混合使用单数和复数形式,而应该为所有资源一直保持使用复数形式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/cars instead of /car
/users instead of /user
/products instead of /product
/settings instead of /setting

4. 为关系使用子资源

假如资源连接到其它资源,则使用子资源形式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /cars/711/drivers/ Returns a list of drivers for car 711
GET /cars/711/drivers/4 Returns driver #4 for car 711

5. 使用HTTP头决定序列化格式

在客户端和服务端都需要知道使用什么格式来进行通信,这个格式应该在HTTP头中指定:

  • Content-Type:定义请求的格式;
  • Accept :定义允许的响应格式的列表

6. 使用HATEOAS

Hypermedia as the Engine of Application State是一个指导原则,它规定超文本链接应该被用于在API中创建更好的资源导航:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "id": 711,
  "manufacturer": "bmw",
  "model": "X5",
  "seats": 5,
  "drivers": [
   {
    "id": "23",
    "name": "Stefan Jauker",
    "links": [
     {
     "rel": "self",
     "href": "/api/v1/drivers/23"
    }
   ]
  }
 ]
}

7. 为集合提供过滤、排序、字段选择以及分页

过滤

为所有字段或者查询语句提供独立的查询参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /cars?color=red Returns a list of red cars
GET /cars?seats<=2 Returns a list of cars with a maximum of 2 seats

排序

允许跨越多字段的正序或者倒序排列:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /cars?sort=-manufactorer,+model

字段选择

一些情况下,我们只需要在列表中查询几个有标识意义的字段,我们不需要从服务端把所有字段的值都请求出来,所以需要支持API选择查询字段的能力,这也可以提到网络传输性能和速度:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /cars?fields=manufacturer,model,id,color

分页

使用offset和limit来获取固定数量的资源结果,当其中一个参数没有出现时,应该提供各自的默认值,比如默认取第一页,或者默认取20条数据:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GET /cars?offset=10&limit=5
GET /cars?&limit=5  //Get first five result
GET /cars?&offset=5  //Get default amount result offset 5

使用自定义的头X-Total-Count发回给调用段实际的资源数量。

前一页后一页的链接也应该在HTTP头链接中得到支持,遵从下文中的链接原则而不要构建你自己的头:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Link: <https://blog.mwaysolutions.com/sample/api/v1/cars?offset=15&limit=5>; rel="next",
<https://blog.mwaysolutions.com/sample/api/v1/cars?offset=50&limit=3>; rel="last",
<https://blog.mwaysolutions.com/sample/api/v1/cars?offset=0&limit=5>; rel="first",
<https://blog.mwaysolutions.com/sample/api/v1/cars?offset=5&limit=5>; rel="prev",

8. 版本化你的API

确保强制实行API版本,并且不要发布一个没有版本的API,使用简单的序列数字,避免使用2.5.0这样的形式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/blog/api/v1

9. 使用HTTP状态码处理错误

忽略错误处理的API是很难使用的,简单的返回500和调用堆栈是非常不友好也非常无用的:

使用HTTP状态码

HTTP标准提供了70多个状态码来描述返回值,我们不需要完全用到他们,下文中列出10个使用率较高的:

200 – OK – 一切正常 201 – OK – 新资源已经被创建 204 – OK – 资源删除成功

304 – 没有变化,客户端可以使用缓存数据

400 – Bad Request – 调用不合法,确切的错误应该在error payload中描述,例如:“JSON 不合法 ” 401 – 未认证,调用需要用户通过认证 403 – 不允许的,服务端正常解析和请求,但是调用被回绝或者不被允许 404 – 未找到,指定的资源不存在 422 – 不可指定的请求体 – 只有服务器不能处理实体时使用,比如图像不能被格式化,或者重要字段丢失。

500 – Internal Server Error – 标准服务端错误,API开发人员应该尽量避开这种错误

使用 error payloads

所有的异常都应该被映射到error payloads中,下文中的例子是一个json payload的模板:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "errors": [
   {
    "userMessage": "Sorry, the requested resource does not exist",
    "internalMessage": "No car found in the database",
    "code": 34,
    "more info": "http://dev.mwaysolutions.com/blog/api/v1/errors/12345"
   }
  ]
}&nbsp;

10. 允许重写HTTP方法

一些代理只支持GET和POST方法,为了在这种限制下支持RESTful API,API需要重写HTTP方法。

使用自定义的X-HTTP-Method-Override  HTTP头来重写POST方法。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-07-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
前端二面vue面试题(边面边更)1
有五种,分别是 State、 Getter、Mutation 、Action、 Module
bb_xiaxia1998
2023/01/03
9560
4. 「vue@2.6.11 源码分析」new Vue() 整体流程和组件渲染之前的准备工作
将组件渲染渲染分为两大步骤:组件信息(事件、方法等等)的初始化,以及组件的渲染。 虽然源码中 $mount方法调用放在了_init方法上,但是感觉拿出来好些,毕竟是两个大的步骤。
tinyant
2023/02/24
6920
4.  「vue@2.6.11 源码分析」new Vue() 整体流程和组件渲染之前的准备工作
Vue源码阅读 - 文件结构与运行机制
vue已是目前国内前端web端三分天下之一,同时也作为本人主要技术栈之一,在日常使用中知其然也好奇着所以然,另外最近的社区涌现了一大票vue源码阅读类的文章,在下借这个机会从大家的文章和讨论中汲取了一些营养,同时对一些阅读源码时的想法进行总结,出产一些文章,作为自己思考的总结,本人水平有限,欢迎留言讨论~
前端下午茶
2018/10/22
5230
Vue源码阅读 - 文件结构与运行机制
vue面试考察知识点全梳理
构建时通过不同的命令执行不同的脚本,去读取不同用处的配置,然后生成适合各种场景的Vue源码。
bb_xiaxia1998
2022/10/25
8570
必会vue面试题(附答案)
使用vue开发时,在vue初始化之前,由于div是不归vue管的,所以我们写的代码在还没有解析的情况下会容易出现花屏现象,看到类似于{{message}}的字样,虽然一般情况下这个时间很短暂,但是还是有必要让解决这个问题的。
bb_xiaxia1998
2022/12/19
1.2K0
上帝视角看Vue源码整体架构+相关源码问答
这段时间利用课余时间夹杂了很多很多事把 Vue2 源码学习了一遍,但很多都是跟着视频大概过了一遍,也都画了自己的思维导图。但还是对详情的感念模糊不清,故这段时间对源码进行了总结梳理。
yyzzabc123
2022/10/03
1.8K0
京东前端高频vue面试题
通俗点理解就是,vuex 弱化 dispatch,通过commit进行 store状态的一次更变;取消了action概念,不必传入特定的 action形式进行指定变更;弱化reducer,基于commit参数直接对数据进行转变,使得框架更加简易;
bb_xiaxia1998
2022/12/19
1.2K0
谈谈vue面试那些题
Vue 的编译过程就是将 template 转化为 render 函数的过程 分为以下三步
bb_xiaxia1998
2022/11/07
8390
一份vue面试知识点梳理清单
指令本质上是装饰器,是 vue 对 HTML 元素的扩展,给 HTML 元素增加自定义功能。vue 编译 DOM 时,会找到指令对象,执行指令的相关方法。
bb_xiaxia1998
2022/11/15
8060
Vue源码阅读 - 依赖收集原理
vue已是目前国内前端web端三分天下之一,同时也作为本人主要技术栈之一,在日常使用中知其然也好奇着所以然,另外最近的社区涌现了一大票vue源码阅读类的文章,在下借这个机会从大家的文章和讨论中汲取了一些营养,同时对一些阅读源码时的想法进行总结,出产一些文章,作为自己思考的总结,本人水平有限,欢迎留言讨论~
前端下午茶
2018/10/22
1.2K0
Vue源码阅读 - 依赖收集原理
从源码解读 - Vue常考面试题
SPA( single-page application )仅在 Web ⻚⾯初始化时加载相应的 HTML、JavaScript 和 CSS。⼀旦⻚⾯加载完成,SPA 不会因为⽤户的操作⽽进⾏⻚⾯的重新加载或跳转;取⽽代之的是利⽤路由机制实现 HTML 内容的变换,UI 与⽤户的交互,避免⻚⾯的重新加载。
秋风的笔记
2020/10/27
3K0
前端面试题汇总-Vue篇
当一个Vue实例创建时,Vue会遍历data中的属性,用 Object.defineProperty(vue3.0使用proxy )将它们转为 getter/setter,并且在内部追踪相关依赖,在属性被访问和修改时通知变化。 每个组件实例都有相应的 watcher 程序实例,它会在组件渲染的过程中把属性记录为依赖,之后当依赖项的setter被调用时,会通知watcher重新计算,从而致使它关联的组件得以更新。
越陌度阡
2023/01/01
1.6K0
前端面试题汇总-Vue篇
[面试] 聊聊你对 Vue.js 框架的理解
本文为一次前端技术分享的演讲稿,所以尽力不贴 Vue.js 的源码,因为贴代码在实际分享中,比较枯燥,效果不佳,而更多的是以图片和文字的形式进行表达。
前端老王
2020/12/14
5K0
【Vuejs】1146- 这些 Vue 的技巧你都掌握了吗?
故事第 1 集:CSS预处理器,你还是只会嵌套么 ?[2] 故事第 2 集:【自适应】px 转 rem,你还在手算么?[3]
pingan8787
2021/12/01
1.7K0
【Vuejs】1146- 这些 Vue 的技巧你都掌握了吗?
一大波vue面试题及答案精心整理
keep-alive是 Vue 提供的一个内置组件,用来对组件进行缓存——在组件切换过程中将状态保留在内存中,防止重复渲染DOM。
bb_xiaxia1998
2022/11/04
5950
2023前端vue面试题(边面边更)_2023-03-01
key 是为 Vue 中 vnode 的唯一标记,通过这个 key,diff 操作可以更准确、更快速
yyds2026
2023/03/01
6230
前端一面必会vue面试题1
为什么要有这些模式,目的:职责划分、分层(将Model层、View层进行分类)借鉴后端思想,对于前端而已,就是如何将数据同步到页面上
bb_xiaxia1998
2022/12/19
9370
进阶vue面试题总结
根据过滤器的名称,过滤器是用来过滤数据的,在Vue中使用filters来过滤数据,filters不会修改数据,而是过滤数据,改变用户看到的输出(计算属性 computed ,方法 methods 都是通过修改数据来处理数据格式的输出显示)。
bb_xiaxia1998
2022/10/19
9420
2022前端经典vue面试题(持续更新中)
一个SPA应用的路由需要解决的问题是 页面跳转内容改变同时不刷新 ,同时路由还需要以插件形式存在,所以:
bb_xiaxia1998
2022/09/16
1K0
前端常见vue面试题合集
通过webpack的tree-shaking功能,可以将无用模块“剪辑”,仅打包需要的
bb_xiaxia1998
2022/11/09
7310
相关推荐
前端二面vue面试题(边面边更)1
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验