关于restful一些注意事项,和自己整理的接口开发规范

lxwphp lxwphp     2022-12-19     301

关键词:

https://blog.csdn.net/u013731455/article/details/56278168

最近在研究restful,公司开发要使用,所以自己就去网上找了好些资料,并整理了一套公司开发的接口规范。当然,我也只是刚刚入坑。还不是很全面。但是这就是一个过程。一点点,总会好起来的。以下是就是RESTful接口规范:

一、   URI

URI规范

1.不用大写;

2.用中杠 - 不用下杠 _ 

3.参数列表要encode

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

5.RESTful架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词(特殊情况可以使用动词),而且所用的名词往往与数据库的表格名对应

 

资源集合 vs单个资源

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

资源集合:

       /zoos //所有动物园

       /zoos/1/animals //id1的动物园中的所有动物

单个资源:

       /zoos/1//id1的动物园

       /zoos/1;2;3//id123的动物园

 

避免层级过深的URI

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

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

 

 

二、   版本

应该将API的版本号放入到URI

           https://api.example.com/v1/zoos

 

 

三、 Request

HTTP方法

通过标准HTTP方法对资源CRUD

GET:查询(从服务器取出资源一项或多项)

GET /zoos

GET /zoos/1

GET/zoos/1/employees

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

POST/animals  //新增动物

POST/zoos/1/employees //id1的动物园雇佣员工

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

PUT/animals/1

PUT /zoos/1

DELETE:删除

DELETE/zoos/1/employees/2

DELETE/zoos/1/employees/2;4;5

DELETE/zoos/1/animals  //删除id1的动物园内的所有动物

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

HEAD:获取资源的元数据

OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的

PATCH:在服务器更新资源(客户端提供改变的属性)

 

安全性和幂等性

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

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

.

安全性

幂等性

GET

POST

×

×

PUT

×

DELETE

×

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

复杂查询

查询可以捎带以下参数:

.

示例

备注

过滤条件

?type=1&age=16

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

排序

?sort=age&order=asc

指定返回结果按照哪个属性排序,以及排序顺序

投影

?whitelist=id,name,email

分页

? page=2&per_page=100

指定第几页,以及每页的记录数

Bookmarker

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

如:GET /trades?status=closed&sort=created,desc

快捷方式:GET /trades#recently-closed或者GET /trades/recently-closed

状态码

    服务器向用户返回的状态码和提示信息,常见的有以下一些(方括号中是该状态码对应的HTTP动词)。

§200 OK - [GET]:服务器成功返回用户请求的数据,该操作是幂等的(Idempotent)。

§201 CREATED - [POST/PUT/PATCH]:用户新建或修改数据成功。

§202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)

§204 NO CONTENT - [DELETE]:用户删除数据成功。

§400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误,服务器没有进行新建或修改数据的操作,该操作是幂等的。

§401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。

§403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。

§404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录,服务器没有进行操作,该操作是幂等的。

§406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格式)。

§410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。

§422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。

§500 INTERNAL SERVER ERROR - [*]:服务器发生错误,用户将无法判断发出的请求是否成功。

状态码的完全列表参见这里

 

URI失效

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

 

四、Response

1.    不要包装:

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

   "success":true,

   "data":"id":1,"name":"xiaotuan",

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

·

response 格式

GET

单个对象、集合

POST

新增成功的对象

PUT/PATCH

更新成功的对象

DELETE

 

五、错误处理

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

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

3.     Response body提供

:返回的信息中将error作为键名,出错信息作为键值即可

1)错误的代码(日志/问题追查);

2)错误的描述文本(展示给用户)。

 

对第三点的实现稍微多说一点:

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

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

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

2.     异常的文本描述;

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

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

2.     Response Body的错误码:异常类名

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

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

状态码

使用场景

400 bad request

常用在参数校验

401 unauthorized

未经验证的用户,常见于未登录。如果经过验证后依然没权限,应该 403(即 authentication authorization的区别)。

403 forbidden

无权限

404 not found

资源不存在

500 internal server error

非业务类异常

503 service unavaliable

由容器抛出,自己的代码不要抛这个异常

 

六、其他

1API的身份认证应该使用OAuth2.0框架

2)服务器返回的数据格式,应该尽量使用JSON,避免使用XML

3)比较复杂的接口不能确定是使用POST还是PUT时,要看具体的业务层代码,看看接口产生的结果是否幂等,如果幂等用PUT,相反用POST

      如:接口接收到一资源,资源存在更新,不存在插入新数据,这个接口就要用PUT

关于接口测试调试的一些总结整理

1.当请求接口返回值为404时,可以查看请求ip,port,address是否正确2.当请求接口返回值为406时,可以查看请求头是否设置了Accept,可以设置成:application/json,text/plain,/3.不同的接口可能使用的提交方式不一样,这时候信息头中的Content-T... 查看详情

github使用整理——关于上传keil工程一些注意的点(代码片段)

git上传警告warning:LFwillbereplacedbyCRLF在上传keil工程时,会遇到warning:LFwillbereplacedbyCRLF警告;warning:LFwillbereplacedbyCRLFin<file-name>.Thefilewillhaveitsoriginallineendingsinyourworkingdirectory.同时下面这句 查看详情

关于kubernetes中资源限制的一些笔记整理(代码片段)

写在前面今天和小伙伴们分享K8s中pod资源限制的一些笔记博文内存涉及pod中通过request和limits实现资源的申请和限制理解不足小伙伴帮忙指正,生活加油_我们的痛苦来源于“夸父追日”一般的对“更好”的追求,也来自于... 查看详情

关于初级java面试问题的一些整理(部分转自他人)

  1、面向对象的特征有哪些方面      1.抽象:  抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂... 查看详情

关于display相关的一些内容—关于rgb接口屏调试

关于display相关的一些内容—关于RGB接口屏调试1)关于VBP、VFP、HFP、HPB的影响需要注意的是,对于像RGB接口tft9k23553这样的tft屏,本身支持通过硬件拉高或者拉低两个管脚来控制扫描的方向和起始点,从而实现上下屏镜像或者左右... 查看详情

关于java时间转换及计算的整理

 一直都想弄个自己的博客来秀一下,也是想记录一些工作的点点滴滴,今天开始自己的博客生涯,希望自己能够坚持下去,加油!话不多说,接触java不久,最近多次遇到时间的转换和计算,今天在此做个总结:1.Date类和Calen... 查看详情

REST 和身份验证变体

...描述】:我目前正在为.net开发一个REST库,我想听听一些关于我的开放点的意见:REST和身份验证。以下是与库一起使用的RESTful接口示例:[RestRoot("/user")]publicinterfaceIUserInterface[RestPut("/")]voidAdd(U 查看详情

关于display相关的一些内容—mipipanel的调试

关于display相关的一些内容—MIPIpanel的调试MIPI接口中DSI-CommandandVideoModesDSI-compliantperipheralssupporteitheroftwobasicmodesofoperation:CommandModeSendingcommandandsend/receivedatato/fromperipheral.VideoModeTransferofreal-timepixeldatatoperipheral.Themodeisuseddependsonthearchite... 查看详情

理解rest接口规范

...客户删除客户多级资源:获取某个客户下的所有订单其它注意事项参考资料如果这篇文章对您有帮助,记得给作者点个赞,谢谢! 查看详情

restful转载,多看几遍就理解了写点自己的看法和理解

...表现层状态转化)原则,就称它为RESTful架构。REST提出了一些设计概念和准则:1、网络上的所有事物都被抽象为资源(resource);2、每个资源对应一个唯一的资源标识(resourceidentifier);3、通过通用的连接器接口(genericc 查看详情

关于multidatatrigger和multitrigger的一些注意事项

他俩有着相同的语法。都是在conditions中编写触发条件。因为都是同一个触发类。在conditions中有Property和Binding这两个属性。那么这两个可以同时使用吗?当然是不可以的对应的关系是MultiDataTriggerBindingMultiTriggerProperty 查看详情

关于linux网络抓包的一些笔记整理(代码片段)

写在前面遇到一个ping单通的情况,需要抓包分析下,所以整理这部分笔记博文内容涉及:HTTP/TCP抓包分析DemoICMP抓包分析DemoNginx抓包分析用户名密码Demo理解不足小伙伴帮忙指正这世界的存在完全只是就它对一个其他事... 查看详情

关于restful接口规范

知乎上的一个通俗易懂的解释:如何给老婆解释什么是RESTful-柳树的文章-知乎https://zhuanlan.zhihu.com/p/30396391 阮一峰大佬的restful设计指南:http://www.ruanyifeng.com/blog/2014/05/restful_api.html#comment-text 查看详情

架构思考

...快就会受到I/O限制。因此,序列化速度和有效负载大小等注意事项变得更加重要。通过HTTP使用REST的一些流行的替代方案包括gRPC,阿帕奇阿夫罗和阿帕奇节俭。这些协议支持二进制序列化,通常比HTTP更有效。考虑以下是在选择... 查看详情

flask关于request一些方法和属性的整理(持续更新)

1.flaskgetrawrequestdata(获取原始数据)可以使用 request.get_data() 获取未经处理过的原始数据,而不管内容类型。数据被缓存,随后可以访问request.data,request.json,请求如果你先访问request.data,它将会自动完成。调用带有... 查看详情

前后端交互-一些关于接口设计的思考

原文链接:前后端交互-一些关于接口设计的思考作者:安东尼_Anthony前言最近在工作中和后端童鞋打交道,前后端沟通最为重点的就是接口API,这里整理一下接口设计的一些考虑点并做分析,希望对大家有帮助。兵... 查看详情

关于display相关的一些内容—lvds接口

关于display相关的一些内容—lvds接口lvds接口《显示lvds–LVDS接口分类,时序,输出格式.docx》需要注意的是,lvds设置的时钟频率是像素时钟频率,即(H_PW+H_BP+H_VD+H_FP)(V_PW+V_BP+V_VD+V_FP)fps。经验:所以出现屏幕闪烁严重,而且是一线... 查看详情

flask关于request一些方法和属性的整理(代码片段)

前提:基于纯后端服务,post请求(Content-Type:application/json,)1.获取未经处理过的原始数据而不管内容类型,如果数据格式是json的,则取得的是json字符串,排序和请求参数一致c=request.get_data()2.将请求参数做了处理,得到的是字典格... 查看详情