首页 > 其他分享 >RESTFul 是不是必须的?

RESTFul 是不是必须的?

时间:2023-11-14 22:24:44浏览次数:42  
标签:GET URL 是不是 必须 使用 POST RESTFul

![[Pasted image 20231114211549.png|600]]

问题1:RESTFul 是不是必须的,是不是设计 API 的最优解?

RESTFul 只是一个风格,作者都承认这只是一种风格风格就是“可选择的”,“可插拔替换的”,在强度上远远弱于“协议”。
凡是上升到协议的东西必须要多方达成一致共识,共同维护且必须遵守,有一定的强制性。
比如 TCP/IP 协议栈中的各种协议,你不这样做就一定不能和其他程序通信。

RESTFul 在表达某些业务场景的时候并没有强大的普适性,必须要额外的进行一层思维上的加工:

将一个行为(behavior)进行转换,转换为对资源(resource)的某种动作(action)

behavior = f(resource + action)

可是这样一搞,又在业务逻辑上额外的引入了一层不必要的复杂度:资源
很明显,世界上不是所有的业务都适合用 “资源” 来表示,比如用户登录,用户注册,如果你一定要生搬硬套脱离日常语义的搞,那么就是:

接口功能 非 RESTFul 表示 RESTFul 表示
用户登录 POST /login POST /session/create
用户注册 POST /register POST /user

这样做很违反直觉,就和 Yoda 表示法 一样让人不舒服。

而且 RESTFul 还有一个严重的问题,很多业务逻辑并不是那几个简单的 HTTP 方法就能完全描述的,比如说 骑自行车,用什么 HTTP 方法去描述这个行为呢?
我们进行一个思维转换,得到了自行车作为资源,那么就是 POST /bike,可这不变成了创建自行车了么?
还是把驾驶员作为资源?使用 POST /bike/driver 创建一个驾驶员?
所以让 RESTFul 去解释世界上所有东西,甚至认为是圣经一样的规则不容破坏是一件很不合适的做法。

问题1:GET 和 POST 有什么区别,我能只使用 POST 吗?

这个问题要看在什么情况下使用这两个方法。
如果是对外的一些服务,比如一个 web 服务,用户使用浏览器访问你的网站,需要 URL 内的查询参数来辅助一些操作,比如保存书签,或者转发 URL,亦或者我们需要跟踪用户的 URL 用来做历史记录,方便进行前进后退。这种情况就应该使用 GET,而且 GET 可以被缓存。
如果是系统内部的通讯用作 RPC API,全部使用 POST 反而能让事情变得更简单,这种情况下不需要使用 GET 的 URL 记录元信息 的能力。

标签:GET,URL,是不是,必须,使用,POST,RESTFul
From: https://www.cnblogs.com/ninkaki/p/17832729.html

相关文章

  • 类必须使用new调用,否则会报错。这是它跟普通构造函数的一个主要区别,后者不用new也可以
    以下符合ES6写法的有:()AclassFoo{constructor(){returnObject.create(null);}}Foo()Bvarm=1;exportm;CexportvarfirstName=’Michael’;D在A模块中export{readFile}后,在B模块中importreadFilefrom‘A’可以获取到readFile正确答案:CA、Fun()把class当......
  • 推荐.Net 必须学习的几个库
    实体框架(EntityFramework)实体框架(EF)是微软为.NET应用程序提供的主要数据访问技术,它提供了一个对象关系映射器(ORM),使得.NET开发者可以使用.NET对象来操作数据库。EF通过将复杂的SQL查询抽象为.NET对象集合来简化数据库操作。EF的关键功能包括:通过配置将.NET类映射......
  • 从事人力资源相关工作,必须要有人力资源证书吗?
    人力资源证书不是HR必备,但高含金量的HR证书确实是个加分项,有时候门槛有时候就是一证之隔。  作为人力资源从业者或者打算从事人力行业的同学,如果有意向考证的不妨看看,有哪些证书可以让你真正学以致用?哪些证书可以作为职场的加分项? 近年来,国际人力资源认证的价值越来越被大众所熟......
  • SqlDateTime 溢出。必须介于 1/1/1753 12:00:00 AM 和 12/31/9999 11:59:59 PM之间
    由于数据库中DateTime类型字段,最小值是1/1/175312:00:00,而.NETFramework中,DateTime类型,最小值是1/1/00010:00:00,显然,超出了sql的值的最小值范围,导致数据溢出错误usingSystem.Data.SqlTypes;namespaceConsoleApplication1{classProgram{staticvoidM......
  • mysql 找空数据 必须 is null
      ......
  • make是不是go的关键字
    keywordgo语言介绍中标榜的一个重要特点是语法简单,这里有一个不同语言关键字的个数,同样是为了防止网页打不开或者丢失,这里单独复制一份:C(ANSI(C89))(32keywords)C(C11)(44keywords)C(C17)(44keywords)C(C99)(37keywords)C#(8.0)(107keywords)C++(C++03)......
  • 均线系统---大家必须知道的最常用的均线系统(全集)
    大家必须知道的最常用的均线战法 温馨提示:短期操盘线:5日均线:攻击线10日均线:操盘线中期操盘线:20日均线:辅助线30日均线:生命线长期操盘线:60日均线:决策线120日均线:趋势线惯用的5均线、10均线、20均线、30均线、60均线、120均线,操盘手对此有特定称谓,考虑这些均线大多是主......
  • 解决某站代码必须登录才能复制的问题
    这个事情是通过bookmarklet来实现的,内容很短。都是老中医,没必要给咱出这偏方。将下列内容加入浏览器书签。javascript:eval(atob("dmFyIGM9QXJyYXkuZnJvbSgkKCJjb2RlIikpLm1hcChhPT5hLmlubmVyVGV4dCkuam9pbigiPGJyPiIucGFkRW5kKDUwLCI9IikrIjxicj4iKTt2YXIgYT13aW5kb3cub3Blbig......
  • java高并发必须知道的概念
    同步(Synchronous)和异步(Asynchronous)同步和异步通常来形容一次方法调用,同步方法调用一旦开始,调用者必须等到方法调用返回后,才能继续后续的行为。异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回,调用者就可以继续后续的操作。而异步方法通常会在另外一个线程中“真实”地......
  • 一名优秀的产品经理,必须具备什么样的思维?
    产品经理(英文:Productmanager,缩写:PM)也称产品企划,是指在公司中针对某一项或是某一类的产品进行规划和管理的人员,主要负责产品的研发、制造、营销、渠道等工作。产品经理是很难定义的一个角色,如果非要一句话定义,那么产品经理是为终端用户服务,负责产品整个生命周期的人。  那一......