时间:2021-05-02
背景
目前微服务架构盛行,在了解了很多的实际微服务项目中,发现很多同时在设计业务 API 接口时,写法五花八门,现总结下目前项目上设计业务 API 接口的一些比较经典误区写法。
1、查询某个对象接口:GET /app/getImportantApp
2、查询列表接口:GET /app/list
3、保存对象接口:POST /app/save
4、删除对象接口:POST /app/delete
5、更新对象接口:POST /app/batchUpdate
是不是感觉很熟悉的代码,难道写的不对?看着挺直观易懂的。如果采用 Restful 架构风格,上面这五种写法当然不对,这是对 Restful 架构风格不了解所致。
微信搜公众号「猿芯」,后台私信回复 1024 免费领取 SpringCloud、SpringBoot,微信小程序、Java面试、数据结构、算法等全套视频资料。
Restful 架构风格定义
由于对 Restful 架构风格理解的不够透彻,一般会产生三种争议的设计误区。
按照对 Restful 架构风格理解,每个业务实体代表一种资源,代表一个名词。
比方说,设计产品列表接口时:
错误写法
请求路径 /getProductList 路径出现动词 get,这种写法是不对的。
推荐写法
另外 URL 出现 /addProduct、/deleteProduct、/updateProduct 等写法也是不对的。
如果某些动作是 HTTP 动词表示不了的,你应该把该动作变成一种资源。
比方说,我们获取用户下的产品列表,错误接口设计是:
或者
正确的写法是把动词 getProducts 改成名词 products
业界对 URI 中是否带版本号存在三种说法。
第一种说法是,在请求路径中加入版本号,比方说:
这种说法认为,在 URI 中加入版本避免了向后兼容,另外通过过期提示,重定向,文档等手段也能降低用户迁移到新的接口上的成本。
当然有人赞成在请求路径中加入版本号,也有人反对这种加版本号的做法,他们认为:
还有一种说法是,在路径中加版本号是错误的设计方式,在老外写的 Versioning REST Services 这篇文章指出,你应该在请求头的 Accept 指定你的版本号,而不是请求路径中。
例如:
前端 js 在请求头 Accept 指定 vnd.example-com.foo+json; version=1.1 的版本 version=1.1。
我个人是比较倾向请求路径中加版本号的,因为我认为加版本号是站在程序角度来考虑新老版本的接口移植问题,特别是现在流行微服务架构,业务粒度很细的情况下,接口的升级,原有版本是否保留呢?
判断是否要加版本号的方法:
当然,加版本号是有一定技巧的,版本号应该放在一个功能模块的后面,甚至一个 url就应该自己独立的版本,如 api/user/v2,这样调用者就不会有整套接口都升级到 v2的错觉。
URL 中路径最好是小写,不要有驼峰式写法,比如下面接口错误写法
推荐写法
或者
总结
我见过很多采用基于微服务架构编写的微服务代码,大多数接口看似 restful 风格,然而仔细辨识才发现,原来是一堆的伪 restful 接口,要么动词名词不分,要么路径版本各种混乱。
实际上的场景是,restful 风格基本上停留在口口相传上,看起来逼格很高的东西也只能高高供起。大部分的程序员为了赶进度,完成 KPI,那还顾得上这种规范,一直在疯狂的打码中。
1、使用名词而不是动词
不要使用:
2、Get 方法和查询参数不应该涉及状态改变
使用 PUT, POST 和 DELETE 方法 而不是 GET 方法来改变状态,不要使用 GET 进行状态改变:
3、使用复数名词
不要混淆名词单数和复数,为了保持简单,只对所有资源使用复数。
4、使用子资源表达关系 如果一个资源与另外一个资源有关系,使用子资源:
5、使用 Http 头声明序列化格式
在客户端和服务端,双方都要知道通讯的格式,格式在 HTTP-Header 中指定
6、为集合提供过滤 排序 选择和分页等功能
Filtering 过滤: 使用唯一的查询参数进行过滤:
Sorting 排序:允许针对多个字段排序
这是返回根据生产者降序和模型升序排列的 car 集合。
移动端能够显示其中一些字段,它们其实不需要一个资源的所有字段,给 API 消费者一个选择字段的能力,这会降低网络流量,提高 API 可用性。
Paging 分页,使用 limit 和 offset.实现分页,缺省 limit=20 和 offset=0;
为了将总数发给客户端,使用订制的 HTTP 头:X-Total-Count。链接到下一页或上一页可以在 HTTP 头的 link 规定,遵循 Link 规定:
7、版本化你的 API
使得 API 版本变得强制性,不要发布无版本的 API,使用简单数字,避免小数点如 2.5
一般在 Url 后面使用 ?v
8、使用 Http 状态码处理错误
如果你的API没有错误处理是很难的,只是返回 500 和出错堆栈不一定有用,Http 状态码提供 70 个出错,我们只要使用 10 个左右:
使用详细的错误包装错误:
允许覆盖http方法
一些代理只支持 POST 和 GET 方法, 为了使用这些有限方法支持 RESTful API,需要一种办法覆盖 http 原来的方法。使用订制的 HTTP 头 X-HTTP-Method-Override 来覆盖 POST 方法.
动词描述GET查询列表或者单个对象的时候使用POST一般是提交表单或者是查询参数比较多的时候使用PUT更新资源的时候使用DELETE删除资源的时候使用
原文地址:https://www.toutiao.com/a6946210249841869319/
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
springmvc实现Restful返回xml格式数据最近,想在自己的小项目中搭建一个Restful风格的服务接口api,项目用的springmvc3,听说sp
这是一个轻量级框架,专为快速开发RESTful接口而设计。如果你和我一样,厌倦了使用传统的MVC框架编写微服务或者前后端分离的API接口,受不了为了一个简单接口
一.前提首先是这个代码基于前后端分离的API,我们用了django的framework模块,帮助我们快速的编写restful规则的接口前端token原理:把(t
【前言】面向资源的Restful风格的api接口本着简洁,资源,便于扩展,便于理解等等各项优势,在如今的系统服务中越来越受欢迎。.net平台有WebAPi项目是
现在服务端程序员的主要工作已经不再是套模版,而是编写基于JSON的API接口。可惜大家编写接口的风格往往迥异,这就给系统集成带来了很多不必要的沟通成本,如果你有