微服务的接口设计(RESTful规范)

基本知识

  • URI:在RESTful架构中,每个URI代表一种资源
  • URI规范:
    1. 不用大写
    2. 用中杠-,不用下划线_
    3. 路径中不能有动词,只能有名词
    4. 名词表示资源集合,要使用复数形式
  • 通过标准HTTP方法对资源进行CRUD(将服务行为映射到标准HTTP动词)
    1. CRUD:增加(Create)、检索(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写
    2. GET(SELECT):从服务器取出/请求资源
    3. POST(CREATE):在服务器新建资源
    4. PUT(UPDATE):在服务器更新资源
    5. DELETE:从服务器删除资源
  • 使用JSON作为微服务提交和返回数据的通用语言
  • 使用HTTP状态码来传达服务调用的状态

示例:

服务器维护资源如下(使用一张表存用户信息)
一般每种资源都会设计字段id来做唯一标识,便于请求资源
User {
int id;
int age;
bool sex;
String phone;
role String;
...
} 该资源的URI设计为
ip:port/service-name/users 获取全部用户的信息
GET ip:port/service-name/users 创建一个用户
POST ip:port/service-name/users 获取某个用户的信息
GET ip:port/service-name/users/id 修改某个用户的信息
PUT ip:port/service-name/users 删除某个用户的信息
DEL ip:port/service-name/users/id

错误设计如下:

创建一个用户
POST ip:port/service-name/users/add 获取某个用户的信息
GET ip:port/service-name/users/id/get 修改某个用户的信息
PUT ip:port/service-name/users/change

有时请求中需要带有很多条件,这些条件可以放在RequestParam(query)里。

比如用户管理B端,做分页展示时,如果每页展示20个用户,接口的设计可能为
GET ip:port/service-name/users?offset=xxx&limit=20 比如返回所有管理员权限的用户,接口的设计可能为
GET ip:port/service-name/users?role=admin

当然,上述只是规范,实际开发中可能会有很多api的设计会突破RESTful规范。

注意保证幂等

幂等:请求一次和请求多次的效果是一样的。

GET:由于GET请求仅仅是获取资源 并不修改资源,所以能保证幂等
PUT:同样的请求,修改一次和修改多次是一样的,能保证幂等
DEL:同理,能保证幂等。但是多次请求,只有第一次能返回200,其他都应该是404
POST:不幂等,多次请求会在数据库表中生成多条记录

最新文章

  1. java异步式Socket响应数据获取方案
  2. mysql - join two derived tables
  3. HTML中常用meta整理
  4. {Reship}{C#}{GDI+}GDI+画笔,线,区域类型
  5. iOS学习笔记---c语言学习第七天
  6. 使用Unidac内置连接池
  7. UVALive 5099 Nubulsa Expo 全球最小割 非网络流量 n^3
  8. win10如何查看文件扩展名
  9. python网络编程(十二)
  10. java visualVM(jconsole)远程监控服务器java进程
  11. 64位Ubuntu系统下ROP攻击
  12. HDU 1689 Just a Hook (线段树区间更新+求和)
  13. B/S和C/S结构的区别
  14. ASP.NET MVC 基于页面的权限管理
  15. C# 中的应用配置
  16. gdb 调试(设置变量)(六)
  17. nodejs 像 C 语言那样输出当前代码的行数
  18. 4513: [Sdoi2016]储能表
  19. centos中如何安装php-bcmath扩展?
  20. TSQL--SQL SERVER 常用系统变量

热门文章

  1. springboot利用redis做缓存
  2. layui+tp5表单提交回调
  3. dockerfile解析过程
  4. golang API 请求队列
  5. synchronized、volatile区别、synchronized锁粒度、模拟死锁场景、原子性与可见性
  6. Springboot项目集成JPush极光推送(Java SDK)
  7. 例题4-2 刽子手游戏(Hangman Judge, UVa 489)
  8. C++ Primer第5版 第一章课后练习
  9. .Net Core实现基于Quart.Net的任务管理
  10. VScode如何配置c/c++运行环境