Restful架构风格下,API接口设计正确的写法是什么

发布时间:2021-10-15 09:17:40 作者:iii
来源:亿速云 阅读:149

这篇文章主要介绍“Restful架构风格下,API接口设计正确的写法是什么”,在日常操作中,相信很多人在Restful架构风格下,API接口设计正确的写法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Restful架构风格下,API接口设计正确的写法是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

1、查询某个对象接口:GET /app/getImportantApp

@GetMapping(path = "/getImportantApp")  public R getImportionApp(@RequestHeader("pid") String pid

2、查询列表接口:GET /app/list

@RequestMapping("/list")  public R list(String deptId)

3、保存对象接口:POST /app/save

@PostMapping("/save")  public R add(CmsAppLicationEntity appLication, String deptId)

4、删除对象接口:POST /app/delete

@DeleteMapping("/delete/{applicationId}")  public R delete(@PathVariable("applicationId") long applicationId)

5、更新对象接口:POST /app/batchUpdate

@PostMapping("/batchUpdate") public R batchUpdate(@RequestBody List<CmsAppLicationEntity> list)

是不是感觉很熟悉的代码,难道写的不对?看着挺直观易懂的。如果采用 Restful 架构风格,上面这五种写法当然不对,这是对 Restful  架构风格不了解所致。

微信搜公众号「猿芯」,后台私信回复 1024 免费领取  SpringCloud、SpringBoot,微信小程序、Java面试、数据结构、算法等全套视频资料。

Restful 架构风格定义

由于对 Restful 架构风格理解的不够透彻,一般会产生三种争议的设计误区。

误区一 请求路径 URI 是动词,而不是名词问题

按照对 Restful 架构风格理解,每个业务实体代表一种资源,代表一个名词。

比方说,设计产品列表接口时:

错误写法

/getProductList

请求路径 /getProductList 路径出现动词 get,这种写法是不对的。

推荐写法

/products

另外 URL 出现 /addProduct、/deleteProduct、/updateProduct 等写法也是不对的。

如果某些动作是 HTTP 动词表示不了的,你应该把该动作变成一种资源。

比方说,我们获取用户下的产品列表,错误接口设计是:

POST /users/1/getProducts

或者

POST /users/1/getProductList

正确的写法是把动词 getProducts 改成名词 products

POST /users/1/products

误区二 URI 中带版本号问题

业界对 URI 中是否带版本号存在三种说法。

第一种说法是,在请求路径中加入版本号,比方说:

POST /products/v1 GET /users/v1 POST /orders/v1 POST /items/v1

这种说法认为,在 URI 中加入版本避免了向后兼容,另外通过过期提示,重定向,文档等手段也能降低用户迁移到新的接口上的成本。

当然有人赞成在请求路径中加入版本号,也有人反对这种加版本号的做法,他们认为:

还有一种说法是,在路径中加版本号是错误的设计方式,在老外写的 Versioning REST Services 这篇文章指出,你应该在请求头的  Accept 指定你的版本号,而不是请求路径中。

例如:

For example, for versions 1.0, 1.1, and 2.0 of the foo data type as JSON set the Accept/Content-Type header as follows: 1.0: vnd.example-com.foo+json; version=1.0 1.1: vnd.example-com.foo+json; version=1.1 2.0: vnd.example-com.foo+json; version=2.0

前端 js 在请求头 Accept 指定 vnd.example-com.foo+json; version=1.1 的版本  version=1.1。

$.ajax({     beforeSend: function (req) {         req.setRequestHeader("Accept", "vnd.example-com.foo+json; version=1.1");          },     type: "GET",     url: "http://http://www.example.com/foo/12",     success: function (data) {         /* code elided */     },     dataType: "json" });

我个人是比较倾向请求路径中加版本号的,因为我认为加版本号是站在程序角度来考虑新老版本的接口移植问题,特别是现在流行微服务架构,业务粒度很细的情况下,接口的升级,原有版本是否保留呢?

那什么时候该加版本号呢?

判断是否要加版本号的方法:

当然,加版本号是有一定技巧的,版本号应该放在一个功能模块的后面,甚至一个 url就应该自己独立的版本,如  api/user/v2,这样调用者就不会有整套接口都升级到 v2的错觉。

误区三 URI 中路径大小写问题

URL 中路径最好是小写,不要有驼峰式写法,比如下面接口错误写法

POST /orderItems/v1/1001

推荐写法

POST /orders/v1/items/1001

或者

/order-items/v1/1001

总结

我见过很多采用基于微服务架构编写的微服务代码,大多数接口看似 restful 风格,然而仔细辨识才发现,原来是一堆的伪 restful  接口,要么动词名词不分,要么路径版本各种混乱。

实际上的场景是,restful 风格基本上停留在口口相传上,看起来逼格很高的东西也只能高高供起。大部分的程序员为了赶进度,完成  KPI,那还顾得上这种规范,一直在疯狂的打码中。

附录1 API 设计风格基本规则

1、使用名词而不是动词

不要使用:

/getAllUsers /createNewUser /deleteAllUser

2、Get 方法和查询参数不应该涉及状态改变

使用 PUT, POST 和 DELETE 方法 而不是 GET 方法来改变状态,不要使用 GET 进行状态改变:

3、使用复数名词

不要混淆名词单数和复数,为了保持简单,只对所有资源使用复数。

/cars 而不是 /car /users 而不是 /user /products 而不是 /product /settings 而部署 /setting

4、使用子资源表达关系 如果一个资源与另外一个资源有关系,使用子资源:

GET /cars/711/drivers/ 返回 car 711的所有司机  GET /cars/711/drivers/4 返回 car 711的4号司机

5、使用 Http 头声明序列化格式

在客户端和服务端,双方都要知道通讯的格式,格式在 HTTP-Header 中指定

6、为集合提供过滤 排序 选择和分页等功能

Filtering 过滤: 使用唯一的查询参数进行过滤:

GET /cars?color=red 返回红色的cars  GET /cars?seats<=2 返回小于两座位的cars集合

Sorting 排序:允许针对多个字段排序

GET /cars?sort=-manufactorer,+model

这是返回根据生产者降序和模型升序排列的 car 集合。

移动端能够显示其中一些字段,它们其实不需要一个资源的所有字段,给 API 消费者一个选择字段的能力,这会降低网络流量,提高 API 可用性。

GET /cars?fields=manufacturer,model,id,color

Paging 分页,使用 limit 和 offset.实现分页,缺省 limit=20 和 offset=0;

GET /cars?offset=10&limit=5

为了将总数发给客户端,使用订制的 HTTP 头:X-Total-Count。链接到下一页或上一页可以在 HTTP 头的 link 规定,遵循 Link  规定:

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",

7、版本化你的 API

使得 API 版本变得强制性,不要发布无版本的 API,使用简单数字,避免小数点如 2.5

一般在 Url 后面使用 ?v

/blog/api/v1

8、使用 Http 状态码处理错误

如果你的API没有错误处理是很难的,只是返回 500 和出错堆栈不一定有用,Http 状态码提供 70 个出错,我们只要使用 10 个左右:

200 &ndash; OK &ndash; 一切正常 201 &ndash; OK &ndash; 新的资源已经成功创建 204 &ndash; OK &ndash; 资源已经成功擅长 304 &ndash; Not Modified &ndash; 客户端使用缓存数据 400 &ndash; Bad Request &ndash; 请求无效,需要附加细节解释如 "JSON无效" 401 &ndash; Unauthorized &ndash; 请求需要用户验证 403 &ndash; Forbidden &ndash; 服务器已经理解了请求,但是拒绝服务或这种请求的访问是不允许的。 404 &ndash; Not found &ndash; 没有发现该资源 422 &ndash; Unprocessable Entity &ndash; 只有服务器不能处理实体时使用,比如图像不能被格式化,或者重要字段丢失。 500 &ndash; Internal Server Error &ndash; API开发者应该避免这种错误。

使用详细的错误包装错误:

{   "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"    }   ] }

允许覆盖http方法

一些代理只支持 POST 和 GET 方法, 为了使用这些有限方法支持 RESTful API,需要一种办法覆盖 http 原来的方法。使用订制的  HTTP 头 X-HTTP-Method-Override 来覆盖 POST 方法.

到此,关于“Restful架构风格下,API接口设计正确的写法是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!

推荐阅读:
  1. SpringBoot整合swagger实现测试Restful风格api
  2. springmvc restful风格遇到的问题

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

restful api

上一篇:Linux内核模块初始化的过程是怎样的

下一篇:Linux 3.0文件系统EXT4 与 Btrfs测试比较的示例分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》