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

REST(Representational State Transfer)表述性状态转换,REST指的是一组架构约束条件和原则。 如果一个架构符合REST的约束条件和原则,我们就称它为RESTful架构。REST本身并没有创造新的技术、组件或服务,而隐藏在RESTful背后的理念就是使用Web的现有特征和能力, 更好地使用现有Web标准中的一些准则和约束。虽然REST本身受Web技术的影响很深, 但是理论上REST架构风格并不是绑定在HTTP上,只不过目前HTTP是唯一与REST相关的实例。

一、URI

URI 表示资源,资源一般对应服务器端领域模型中的实体类。

一般规范:

1、不用大写;

2、用中杠 - 不用下杠 _;

3、参数列表要encode;

4、URI中的名词表示资源集合,使用复数形式。

5、URI表示资源的两种方式:资源集合、单个资源。

资源集合:

/zoos         //所有动物园

/zoos/1/animals    //id为1的动物园中的所有动物

单个资源:

/zoos/1      //id为1的动物园

/zoos/1;2;3    //id为1,2,3的动物园

6、避免层级过深的Uri

/ 在url中表达层级,用于按实体关联关系进行对象导航,一般根据id导航。

过深的导航容易导致url膨胀,不易维护,如 GET /zoos/1/areas/3/animals/4,尽量使用查询参数代替路径中的实体导航,如GET /animals?zoo=1&area=3;

7、对组合资源的访问

服务器端的组合实体必须在uri中通过父实体的id导航访问。

组合实体不是first-class的实体,它的生命周期完全依赖父实体,无法独立存在,在实现上通常是对数据库表中某些列的抽象,不直接对应表,也无id。一个常见的例子是 User — Address,Address是对User表中zipCode/country/city三个字段的简单抽象,无法独立于User存在。必须通过User索引到Address:GET /user/1/addresses

二、Request

HTTP方法,通过标准HTTP方法对资源CRUD:

GET:查询

POST:创建单个资源。POST一般向“资源集合”型uri发起

PUT:更新单个资源(全量),客户端提供完整的更新后的资源。与之对应的是 PATCH,PATCH 负责部分更新,客户端提供要更新的那些字段。PUT/PATCH一般向“单个资源”型uri发起

DELETE:删除

HEAD / OPTION 用的不多,就不多解释了。

1、安全性和幂等性

安全性:不会改变资源状态,可以理解为只读的;

幂等性:执行1次和执行N次,对资源状态改变的效果是等价的。

安全性和幂等性均不保证反复请求能拿到相同的response。以 DELETE 为例,第一次DELETE返回200表示删除成功,第二次返回404提示资源不存在,这是允许的。

2、复杂查询

查询可以捎带以下参数:

.示例备注

过滤条件

?type=1&age=16

允许一定的uri冗余,如/zoos/1与/zoos?id=1

排序

?sort=age,desc

投影

?whitelist=id,name,email

分页

?limit=10&offset=3

3、Bookmarker

经常使用的、复杂的查询标签化,降低维护成本。

GET /trades?status=closed&sort=created,desc//快捷方式

GET /trades#recently-closed

或者

GET/trades/recently-closed

4、Format

只用以下常见的3种body format:

(1)Content-Type: application/json

(2)Content-Type: application/x-www-form-urlencoded (浏览器POST表单用的格式)

Content-Type: multipart/form-data; boundary=—-RANDOM_jDMUxq4Ot5 (表单有文件上传时的格式)

(3)Content Negotiation

资源可以有多种表示方式,如json、xml、pdf、excel等等,客户端可以指定自己期望的格式,通常有两种方式:

http header Accept:Accept:application/xml;q=0.6,application/atom+xml;q=1.0(q为各项格式的偏好程度)

url中加文件后缀:/zoo/1.json

三、Response

1、无需包装

response 的 body 直接就是数据,不要做多余的包装。错误示例:

{"success":true,"data":{"id":1,"name":"xiaotuan"},

}

2、各HTTP方法成功处理后的数据格式:

3、json格式的约定:

时间用长整形(毫秒数),客户端自己按需解析(moment.js)

不传null字段

4、分页

{"paging":{"limit":10,"offset":0,"total":729},"data":[{},{},{}...]

}

四、错误处理

1、不要发生了错误但给2xx响应,客户端可能会缓存成功的http请求;

2、正确设置http状态码,不要自定义;

3、Response body 提供 1) 错误的代码(日志/问题追查);2) 错误的描述文本(展示给用户)。

对第三点的实现稍微多说一点:Java 服务器端一般用异常表示 RESTful API 的错误。

API 可能抛出两类异常:业务异常和非业务异常。业务异常由自己的业务代码抛出,表示一个用例的前置条件不满足、业务规则冲突等,比如参数校验不通过、权限校验失败。非业务类异常表示不在预期内的问题,通常由类库、框架抛出,或由于自己的代码逻辑错误导致,比如数据库连接失败、空指针异常、除0错误等等。

业务类异常必须提供2种信息:

(1)如果抛出该类异常,HTTP 响应状态码应该设成什么;

(2)异常的文本描述;

在Controller层使用统一的异常拦截器:

设置 HTTP 响应状态码:对业务类异常,用它指定的 HTTP code;对非业务类异常,统一500;

Response Body 的错误码:异常类名

Response Body 的错误描述:对业务类异常,用它指定的错误文本;对非业务类异常,线上可以统一文案如“服务器端错误,请稍后再试”,开发或测试环境中用异常的 stacktrace,服务器端提供该行为的开关。

常用的http状态码及使用场景:

五、服务型资源

除了资源简单的CRUD,服务器端经常还会提供其他服务,这些服务无法直接用上面提到的URI映射。如:

按关键字搜索;

计算地球上两点间的距离;

批量向用户推送消息

可以把这些服务看成资源,计算的结果是资源的presentation,按服务属性选择合适的HTTP方法。

GET /search?q=filter?category=file 搜索

GET/distance-calc?lats=47.480&lngs=-122.389&late=37.108&lnge=-122.448POST/batch-publish-msg

[{"from":0,"to":1,"text":"abc"},{},{}...]

六、异步任务

对耗时的异步任务,服务器端接受客户端传递的参数后,应返回创建成功的任务资源,其中包含了任务的执行状态。客户端可以轮训该任务获得最新的执行进度。

提交任务:

POST/batch-publish-msg

[{"from":0,"to":1,"text":"abc"},{},{}...]

返回:

{"taskId":3,"createBy":"Anonymous","status":"running"}

GET/task/3{"taskId":3,"createBy":"Anonymous","status":"success"}

如果任务的执行状态包括较多信息,可以把“执行状态”抽象成组合资源,客户端查询该状态资源了解任务的执行情况。

提交任务:

POST/batch-publish-msg

[{"from":0,"to":1,"text":"abc"},{},{}...]

返回:

{"taskId":3,"createBy":"Anonymous"}

GET/task/3/status

{"progress":"50%","total":18,"success":8,"fail":1}

七、api演进

1、版本。常见的三种方式:

在uri中放版本信息:GET /v1/users/1

Accept Header:Accept: application/json+v1

自定义 Header:X-Api-Version: 1

2、URI失效

随着系统发展,总有一些API失效或者迁移,对失效的API,返回404 not found 或 410 gone;对迁移的API,返回 301 重定向。

restful url 设计规范_RESTful API接口设计规范相关推荐

  1. RESTful API接口设计规范

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

  2. API 接口设计规范

    概述 这篇文章分享 API 接口设计规范,目的是提供给研发人员做参考. 规范是死的,人是活的,希望自己定的规范,不要被打脸. 路由命名规范 动作 前缀 备注 获取 get get{XXX} 获取 ge ...

  3. java接口安全怎么处理_Restful API 接口安全性设计

    1.API接口设计规范 2.安全性设计 a.白名单限制 仅接受特定系统的请求响应,调用方的IP地址需要在本系统中报备,否则无法调用 b.合法身份合法性验证 Basic Authentication : ...

  4. HTTP API接口设计规范

    1. 所有请求使用POST方法 使用post,相对于get的query string,可以支持复杂类型的请求参数.例如日常项目中碰到get请求参数为数组类型的情况. 便于对请求和响应统一做签名.加密. ...

  5. java restful中文乱码_restful服务接口访问乱码 和 505错误

    标签: 用cxf 发部个rest服务,用浏览器访问和 HttpURLConnection 访问. 1. URL中有中文,浏览器访问正常,HttpURLConnection 失败. 解决: HttpUR ...

  6. java restful开发规范_restful api 开发规范

    1.协议 http && https 2.域名 https://api.example.com && https://example.org/api/ 3.版本  ht ...

  7. php api接口调试,PHP进行API接口测试

    最近写API接口,每写一个接口,我自己需要先测试一下,看有没有语法错误,请求的数据对不对,但是很多都是POST请求,没法直接在浏览器中打开链接进行测试,所以必须要有个可以在本地发HTTP请求的模拟工具 ...

  8. 链接太长如何缩短?稳定的短链接api接口分享与用法实例

    网络营销中的微信,短信,微博和软文推广中链接太长非常影响营销效果,那么如何将长链接缩短成短链接呢?今天给大家讲解下网址缩短方式,以新浪短网址http://t.cn/xxx和腾讯短网址http://ur ...

  9. 如何生成api接口获取宝贝商品详情,商品详情接口,产品详情

    API (Application Programming Interface)是指应用程序接口,它是一种通过编写一组统一的规则,开发一个软件来与其他应用程序进行通讯的技术.API可以方便应用程序之间的 ...

最新文章

  1. 网站栏目页要如何进行优化呢?
  2. VS Tips]Visual Studio 2008 Toolbox里控件消失(#13119)的问题
  3. VTK:模型之CappedSphere
  4. FileUploadUtil
  5. HTML5获取autoComplete属性:告诉浏览器是否记录之前的输入值
  6. 关于laravel 框架运行数据库迁移文件的一个小坑以及常用php artisan命令
  7. 自定义View 进度条
  8. 监督学习和非监督学习
  9. 只读副本和Spring Data第3部分:配置两个实体管理器
  10. “算法天团”最强课程笔记已整理好,速查收!【附PPT打包下载】
  11. 您的用户账户没有连接到http://192.168.0.112:8080/tfs上的team foundation server的权限
  12. Microsoft Excel设置单元格下拉框的方法
  13. 【专利】实用新型专利设计模板
  14. 华为盒子 原生android,手把手教你刷机把华为悦盒刷机为安卓网络机顶
  15. Linux 下修改数据库密码
  16. java 参数命名规则_Java命名规范
  17. win10升级助手_不用QQ也能电脑远程,win10这隐藏功能太良心了!真后悔发现太晚...
  18. CentOS_7配置静态ip地址
  19. 明势资本黄明明:创新与世界,下一代基础软件的中国突围之路
  20. 人工智能数据标注平台推荐

热门文章

  1. 弹球游戏python代码含记分模式_python编写弹球游戏的实现代码
  2. java applet 记事本_jsb java编写的安卓app记事本程序,适合app初学者 Applet 243万源代码下载- www.pudn.com...
  3. php 前端页面的路由,ThinkPHP5路由
  4. 如何维持整洁的 Git 提交记录?送你三个锦囊!
  5. 皮一皮:谁还不是个孩子...
  6. 这家公司不要求996,但照样市值万亿!
  7. 图文并茂,详细讲解UML类图符号、各种关系说明以及举例
  8. @Async的使用、原理及使用时可能导致的问题
  9. 面了一把Java P6 岗,一个问题就干趴下了!
  10. 微信悄然上线了十款新表情,你注意到了吗?