RESTful规范建议
RESTful概述
RESTful是目前最流行的一种互联网软件架构。它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
REST是Representational State Transfer的缩写,是Roy Thomas Fielding在他2000年的博士论文中提出的。其提出的设计概念和准则为:
1. 网络上的所有事物都可以抽象为资源
2. 每个资源都应该有唯一的标识(identifier),对资源的操作不会改变标识
3. 所有的操作都是无状态的
4. 使用标准方法(GET、POST、PUT、PATCH、DELETE)操作资源
RESTful使用
| HTTP方法 | URI | 描述 | 幂等 | 安全 |
| GET | /api/members | 获取成员列表 | 是 | 是 |
| GET | /api/members/{id} | 获取指定成员 | 是 | 是 |
| POST | /api/members | 创建一个成员 | 否 | 否 |
| PUT | /api/members/{id} | 更新成员所有信息 | 是 | 否 |
| PATCH | /api/members/{id} | 更新成员部分信息 | 是 | 否 |
| DELETE | /api/members/{id} | 删除指定成员 | 是 | 否 |
| HTTP方法 | URI | 描述 | 幂等 | 安全 |
| GET | /api/groups | 获取群组列表 | 是 | 是 |
| GET | /api/groups/{id} | 获取指定群组 | 是 | 是 |
| POST | /api/groups | 创建一个群组 | 否 | 否 |
| PUT | /api/groups/{id} | 更新群组所有信息 | 是 | 否 |
| PATCH | /api/groups/{id} | 更新群组部分信息 | 是 | 否 |
| DELETE | /api/groups/{id} | 删除指定群组 | 是 | 否 |
| GET | /api/groups/{id}/members | 获取指定群组下的成员 | 是 | 是 |
| GET | /api/groups/{id}/members/{memberId} | 获取指定群组下的指定成员 | 是 | 是 |
幂等性:同一个RESTful接口的多次访问,得到的资源状态是相同的。
安全性:对该RESTful接口访问,不会使服务端资源的状态发生改变。
规范建议
1. API尽量采用通过安全通道的HTTPS协议(https)。
2. 请求体与响应体统一通过json格式来承载,json使用Camel的命名规则,媒体类型需设置为“application/json”。
示例:
Request
Accept: application/json
Content-Type: application/json
Response
Content-Type: application/json
3. 请求体与响应体统一采用UTF-8编码格式,时间统一使用UTC格式:yyyy-MM-dd'T'HH:mm:ss[.SSS]'Z'。
4. URI模版:/{domain}/{service or module}/api/{version}/{resource},URI应全为小写字母,短语单词使用“-”分隔。
| 名称 | 说明 | 示例 |
| domain | 领域名称,不需要区分领域时,可以不指定 |
education(教育领域) finance(金融领域) game(游戏领域) |
| service or module | 服务或模块名 |
account(账户模块) order(订单服务) storage(库存服务) |
| version | 版本号 |
v1 v2 v3 |
| resource | 服务或模块内资源 |
users(用户) products(产品) members(成员) |
5. 资源增、删、改、查外的操作,采用模板:/{domain}/{service or module}/api/{version}/{resource}/action/{action}。
示例:/common/account/api/v1/users/action/login
响应消息建议
1. 获取资源列表成功返回,响应消息体中包含记录总条数、当前页码、每页记录,以及对应的资源。
示例:
Response Body
{
"total": xxx,
"pageIndex": xxx,
"pageSize":xxx,
"records":[
{ "id": xxx, "name":"xxx" },
{ "id": xxx, "name":"xxx" }
]
}
2. 获取指定资源成功返回200,响应消息体中包含该资源的信息。
3. 创建资源成功返回,并在响应消息头中包含定位该资源的地址。
示例:
Response Headers
{
"pragma": "no-cache",
"server": "xxx",
"content-type": "application/json; charset=utf-8",
"location": "https://xxx/api/users/xxx", //资源访问地址
"content-length": "xxx"
}
4. 资源更新成功返回,并在响应消息中体返回更新后的资源内容。
5. 资源删除成功返回,响应消息体无内容。
6. 针对400 Bad Request客户端错误,可以在响应消息体中扩展状态码。
示例:
Response Code
401 Bad Request
Response Body
{
"code": 400001,
"message": "用户名或密码错误"
}
----------------------------------------------------------
Response Code
401 Bad Request
Response Body
{
"code": 400002,
"message": "邮箱已存在"
}
----------------------------------------------------------
Response Code
401 Bad Request
Response Body
{
"code": 400003,
"message": "邮箱地址错误"
}
7. 针对5XX的服务端错误,只在响应消息体中提供简单提示,不可打印错误日志信息。
示例:
Response Body
{
"message": "内部错误,请稍后再试或联系管理员"
}
7. 其他客户端错误的响应码,只在响应消息体中提供相应提示。
示例:
Response Code
401 Unauthorized
Response Body
{
"message": "用户未登录"
}
----------------------------------------------------------
Response Code
403 Forbidden
Response Body
{
"message": "权限不足"
}
----------------------------------------------------------
Response Code
404 Not Found
Response Body
{
"message": "请求资源不存在或已被删除"
}
常见响应码
| 响应码 | 说明 |
| 200 OK | 请求已成功 |
| 201 Created | 资源已创建 |
| 204 No Content | 请求已成功,但无返回内容 |
| 304 Not Modified | 缓存有效 |
| 400 Bad Request | 语义有误,当前请求无法被服务器理解,请求参数错误 |
| 401 Unauthorized | 当前请求需要用户认证(登录) |
| 403 Forbidden | 用户已认证(登录),但权限不足 |
| 404 Not Found | 请求源未在服务器上被发现 |
| 405 Method Not Allowed | 请求方法不能被用于请求相应的资源,如使用PUT方法访问只接受POST方法的API |
| 500 Internal Server Error | 服务端内部错误 |
| 502 Bad Gateway | 网关错误 |
| 504 Gateway Timeout | 网关超时 |
RESTful规范建议的更多相关文章
- restful 规范(建议)
需求:开发cmdb,对用户进行管理. 做前后端分离,后端写api(URL),对用户表进行增删改查,应该写四个URL(还要给文档(返回值,返回,请求成功,干嘛,失败,干嘛)),然后分别写视图函数. ht ...
- RESTful 规范
RESTful 规范 前言 rest 是一种软件架构风格,如果使用的是 rest 接口,那么就可以说你的接口是 restful. rest接口是围绕''资源''展开的,利用 HTTP 的协议,其实 r ...
- DjangoRestFramework 学习之restful规范 APIview 解析器组件 Postman等
DjangoRestFramework学习一之restful规范.APIview.解析器组件.Postman等 本节目录 一 预备知识 二 restful规范 三 DRF的APIView和解析器组件 ...
- Django restful 规范
一.REST Frame Work REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为"表征状态转移&q ...
- django rest framework restful 规范
内容回顾: . django请求生命周期 -> 执行遵循wsgi协议的模块(socket服务端) -> 中间件(路由匹配) -> 视图函数(业务处理:ORM.模板渲染) -> ...
- day89 DjangoRsetFramework学习---restful规范,解析器组件,Postman等
DjangoRsetFramework学习---restful规范,解析器组件,Postman等 本节目录 一 预备知识 二 restful规范 三 DRF的APIView和解析 ...
- 18.DjangoRestFramework学习一之restful规范、APIview、解析器组件、Postman等
一 预备知识 预备知识:django的CBV和FBV CBV(class based view):多用,简单回顾一下 FBV(function based view): CBV模式的简单操作:来个登陆 ...
- day 87 DjangoRestFramework学习一之restful规范、APIview、解析器组件、Postman等
DjangoRestFramework学习一之restful规范.APIview.解析器组件.Postman等 本节目录 一 预备知识 二 restful规范 三 DRF的APIView和解析器组 ...
- 01 drf源码剖析之restful规范
01 restful规范 目录 01 restful规范 1. 什么是restful规范 2.restful规范详细 1. 什么是restful规范 restful是一套规则,是程序间进行数据传输的一 ...
随机推荐
- Dynamics CRM 给视图配置安全角色
CRM2011后给表单设置了安全角色,可以配置实体表单给不同的安全角色查看,但视图的权限始终没有开放配置,这里介绍个工具可以实现这种配置. 先奉上2011/2013版本的工具地址(2015/2016见 ...
- 11.1、Libgdx的音频之音效
(官网:www.libgdx.cn) 音效通常是比较小的音频文件,通常是几秒钟的长度.通常用在特定的游戏事件中,比如跳跃或者射击. 音效可以保存为多种格式.Libgdx支持MP3.OGG和WAV文件. ...
- Socket层实现系列 — connect()的实现
主要内容:connect()的Socket层实现.期间进程的睡眠和唤醒. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 应用层 int connect( ...
- Linux进程-进程的创建
今天学习了Linux的进程创建的基本原理,是基于0.11版本核心的.下面对其作一下简单的总结. 一.Linux进程在内存中的相关资源 很容易理解,Linux进程的创建过程就是内存中进程相关资源产生 ...
- Git版本控制 — 日常使用(二)
本地使用 以下是我的一些日常操作. (1) 创建版本库 # cd /proj # git init Initialized empty Git repository in /proj/.git/ (2 ...
- (十八)TableView实践(多组汽车品牌展示)
对于多组数据,可能会用到模型的嵌套. 例如多组汽车,每组是一个模型,组内有多辆车的信息,每辆车的信息也是一个模型,相当于模型中有模型. 可以看到,每个item是一个字典,这要创建一个模型,而模型内部的 ...
- Android群英传帝落篇——程序人生,路漫漫其修远兮,吾将上下而求索!
Android群英传帝落篇--程序人生,路漫漫其修远兮,吾将上下而求索! 当写这篇博客的时候,自2016-02-22到现在5.2号,一晃眼,也㓟两个多月就过去了,我才将这本书看完,虽然写笔记花了很大的 ...
- 总结C语言在嵌入式开发中应用的知识点(文件数据的加密与解密)
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255) ...
- Rxjava + retrofit + dagger2 + mvp搭建Android框架
最近出去面试,总会被问到我们项目现在采用的什么开发框架,不过据我的经验网络框架(volley)+图片缓存(uIl)+数据库(orm)+mvp,不过现在这套框架比较好了,现在采用什么呢?Rxjava + ...
- 一个简单的基于 DirectShow 的播放器 1(封装类)
DirectShow最主要的功能就是播放视频,在这里介绍一个简单的基于DirectShow的播放器的例子,是用MFC做的,今后有机会可以基于该播放器开发更复杂的播放器软件. 注:该例子取自于<D ...