关于RESTful API的一些思考与疑问

最近在研究API规范的最佳实践。发现关于RESTful API规范的信息甚是模糊,没有一个明确的权威的说法,至少国内搜到的信息是这样的。比如下面的三篇文章,其中的内容差异很大,甚至相反(比如PUT和POST的用法),有此可见整个RESTful API规范实现的乱象。

RESTful API 规范 v1.0

Restful API 的设计规范

REST API URI的七大设计原则

其实RESTful API并没有一个权威的标准(至少笔者没有查到),REST只是一个抽象概念,RESTful API相当于其具体应用实现,既然没有绝对的标准,那么今天就来讨论一下吧。

1、是否启用PUT、DELETE?修改和创建,哪个用PUT哪个用POST?

参考:POST增、GET查、DELETE删、PUT改

eg:GET /companies、GET /companies/3、POST /companies/3、DELETE /companies/3、PUT /companies/3

讨论:HTTP 1.1 这个版本是当前版本,包含GET(0.9) HEAD(1.0) POST(1.0) OPTIONS PUT DELETE TRACE CONNECT这8个方法,兼容性是毫无问题的。但是POST和PUT的区别是什么?

2、是否可以有动词?名词单数还是复数?

参考:不应该有动词(用POST、GET、DELETE、PUT区分),全是名词复数。

eg:/companies/3/employees/45

讨论:这样看起来的确优雅,但是下面的场景如何处理呢。

  • 详情页与编辑页(浏览器地址)如何设计?例:员工列表->员工详情 / 员工编辑
  • 详情页就是子层级的列表页时如何设计?例:公司列表->公司详情(就是部门列表)->部门详情(就是员工列表)->员工详情
  • tabs怎么办?用query?
3、单词连接用"-"横线、"_"下划线,还是驼峰?

参考:用横线"-",防止整个地址有超链接下划线时"_"看不出,RFC 3986将URI定义为区分大小写,但scheme 和 host components除外。

eg:/salary-records/3/paybill-details/34

讨论:python的变量推荐用"_",这种习惯会被带到这里;另外,返回的数据里的key是否应该采用驼峰?eslint的报错很烦的。

4、结尾应不应该包含斜杠“/”?

参考:不加

讨论:在地址栏与API中,以"/"为结尾有何区别?

5、地址栏的URL与API的get请求如何区分?

参考:用域名区分

eg:https://www.example.com/companies/3 、 https://apis.example.com/companies/3

讨论:会不会混淆或有其他副作用?另外还有2当中讨论的第一个场景。

6、是否与http统一状态码?

参考:返回状态码推荐标准HTTP状态码

有很多服务器将返回状态码一直设为200,然后在返回body里面自定义一些状态码来表示服务器返回结果的状态码。由于rest api是直接使用的HTTP协议,所以它的状态码也要尽量使用HTTP协议的状态码。

eg:200 OK 服务器返回用户请求的数据,该操作是幂等的

201 CREATED 新建或者修改数据成功

204 NOT CONTENT 删除数据成功

400 BAD REQUEST 用户发出的请求有问题,该操作是幂等的

401 Unauthoried 表示用户没有认证,无法进行操作

403 Forbidden 用户访问是被禁止的

422 Unprocesable Entity 当创建一个对象时,发生一个验证错误

500 INTERNAL SERVER ERROR 服务器内部错误,用户将无法判断发出的请求是否成功

503 Service Unavailable 服务不可用状态,多半是因为服务器问题,例如CPU占用率大,等等

讨论:现在的success=true,个人觉得信息量不足。

7、版本控制放在URL中还是HEADER中?

讨论:现在的payroll是放在URL中


8、非标准RESTful API真的不好吗?

/companies/3/departments/15/employees/45

VS

/employee?company=3&depart=15&employee=45

请参考另一篇文章,并留下宝贵意见params与query分别适合于何种场景?


参考文献:

RESTful API Designing guidelines — The best practices

RESTful Web Services Cookbook中文版(这书好烂)

理解RESTful架构——阮一峰

RESTful API 设计指南——阮一峰


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RESTful是一种设计风格和架构原则,用于构建可伸缩的网络应用程序。它是一种基于HTTP协议的约束性架构,旨在提供一种简单、轻量级、可扩展和可维护的方式来设计和构建Web服务。 RESTful API是基于RESTful原则设计的API。它使用HTTP协议的GET、POST、PUT和DELETE等请求方法,通过URL和请求头传递参数,使用状态码和响应体返回数据,实现了客户端和服务器之间的通信和数据交互。RESTful API通常使用JSON或XML格式来传输数据。 在引用中提到的SpringBoot Mybatis CXF框架,可以帮助我们快速开发和部署RESTful API。而引用中的ansible-api是一个基于RESTful HTTP API的IT自动化系统,它提供了一种使用RESTful API进行配置和管理的方式。 总之,RESTful是一种设计风格和架构原则,而RESTful API是基于RESTful原则设计的API,用于实现客户端和服务器之间的通信和数据交互。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [SpringBoot+Mybatis+CXF框架,实现Restful api与 WebService api接口的大实验](https://download.csdn.net/download/u011938827/87662947)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [ansible-api:Ansible的RESTful HTTP Api](https://download.csdn.net/download/weixin_42138139/14971104)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值