当被大佬问到何为restful,你会吗?

0.引言
很多时候,大部分的人都是知道一个知识点,但是并不是理解这个知识点,今天我就来讲讲Restful,首先了解几个概念:

  1. 什么是 API:API 是一组用于构建和集成应用程序软件的定义和协议。它有时被称为信息提供者和信息用户之间的合同——建立消费者所需的内容(调用)和生产者所需的内容(响应)。
  2. REST:Representational State Transfer 表现层状态转化
  3. 资源(Resources):REST全称是表述性状态转移,那究竟指的是什么的表述? 其实指的就是资源,资源是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。你可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI
  4. 表现层(Representation):"资源"是一种信息实体,它可以有多种外在表现形式。我们把"资源"具体呈现出来的形式,叫做它的"表现层"(Representation)。
  5. 状态转化(State Transfer):如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状态转化"(State Transfer)。而这种转化是建立在表现层之上的,所以就是"表现层状态转化"。

1.什么是RESTful架构
一种设计风格
REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。

==RESTful架构是对MVC架构改进后所形成的一种架构,通过使用事先定义好的接口与不同的服务联系起来。在RESTful架构中,浏览器使用POST,DELETE,PUT和GET四种请求方式分别对指定的URL资源进行增删改查操作。因此,RESTful是通过URI实现对资源的管理及访问,具有扩展性强、结构清晰的特点。==

RESTful架构将服务器分成前端服务器和后端服务器两部分,前端服务器为用户提供无模型的视图;后端服务器为前端服务器提供接口。浏览器向前端服务器请求视图,通过视图中包含的AJAX函数发起接口请求获取模型。

通俗点:当我们前端向服务端发送请求的时候,以前我们可能会这样写:/addUser、 /deleteUser、/updateUser......等等形式,这样就会导致url膨胀,我们能做的就是只用一个url:/User,然后通过发送put、get、post、delete的请求来区分。
在这里插入图片描述

2.RESTFUL特点

  • 每一个URI代表1种资源;
  • 客户端使用GET、POST、PUT、DELETE 4个表示操作方式的动词对服务端资源进行操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源;
  • 通过操作资源的表现形式来操作资源;
  • 资源的表现形式是XML或者HTML;
  • 客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都必须包含理解请求所必需的信息。

详细介绍
REST 架构风格是为基于网络的应用程序设计的,特别是客户端-服务器应用程序。但更重要的是,它是为互联网规模的使用而设计的,因此用户代理(客户端)和源服务器之间的耦合必须尽可能轻量(松散)以促进大规模采用。这是通过定义封装实体的资源在服务器上创建一个抽象层来实现的(例如文件)在服务器上,因此隐藏了底层实现细节(文件服务器、数据库等)。但定义比这更普遍:任何可以命名的信息都可以是资源:图像、数据库查询、时间服务(例如“伦敦今天的天气”),甚至是其他资源的集合。这种方法允许在跨组织(信任)边界的长期 Internet 规模环境中的客户端和服务器之间实现最大的互操作性。

客户端只能使用URI访问资源。换句话说,客户端使用 URI 请求资源,服务器使用资源的表示进行响应。资源的表示是 REST 中的另一个重要概念。为了确保响应可以被尽可能多的客户端应用程序解释,资源的表示以超文本格式发送。因此,通过在客户端和服务器之间的消息中传输的超文本表示来操纵资源。

客户端和服务器的强解耦以及使用统一寻址协议的基于文本的信息传输为满足 Web 的要求提供了基础:健壮性(无政府可扩展性)、组件的独立部署、大粒度数据传输和内容读者、内容作者和开发人员的低门槛。

3.为了使 API 被视为 RESTful,它必须符合以下标准

  • 由客户端、服务器和资源组成的客户端-服务器架构,通过 HTTP 管理请求。
  • 无状态客户端-服务器通信,这意味着在 get 请求之间不存储客户端信息,并且每个请求都是独立且未连接的。
  • 简化客户端-服务器交互的可缓存数据。
  • 组件之间的统一接口,以便以标准形式传输信息。这要求:
    • 请求的资源是可识别的,并且与发送给客户端的表示分开。
    • 客户端可以通过它们接收到的表示来操作资源,因为表示包含足够的信息来这样做。
    • 返回给客户端的自描述消息有足够的信息来描述客户端应该如何处理它。
    • 超文本/超媒体可用,这意味着在访问资源后,客户端应该能够使用超链接来查找他们可以采取的所有其他当前可用操作。
  • 组织每种类型的服务器(负责安全、负载平衡等)的分层系统涉及将请求的信息检索到客户端不可见的层次结构中。
  • 按需代码(可选):在请求时从服务器向客户端发送可执行代码的能力,扩展客户端功能。

总结:尽管 REST API 符合这些标准,但它仍然被认为比规定的协议(如 SOAP(简单对象访问协议))更易于使用,SOAP(简单对象访问协议)具有特定的要求,如 XML 消息传递,以及内置的安全性和事务合规性,使其成为更慢更重。

#高频知识点汇总##学习路径#
全部评论
写的不错
1 回复
分享
发布于 2021-12-31 00:19
阅文集团
校招火热招聘中
官网直投
1 回复
分享
发布于 2021-12-31 12:11
@人品酱(77***05) 来吧
点赞 回复
分享
发布于 2021-12-02 14:41
🎉恭喜牛友成功参与 【创作激励计划】高频知识点汇总专场,并通过审核! ------------------- 创作激励计划5大主题专场等你来写,最高可领取500元京东卡和500元实物奖品! 👉快来参加吧:https://www.nowcoder.com/discuss/804743
点赞 回复
分享
发布于 2021-12-02 15:03
点赞 回复
分享
发布于 2022-01-04 09:57
学到了,点赞
点赞 回复
分享
发布于 2022-01-05 22:03

相关推荐

部门介绍自我介绍短连接是你自己的项目吗?(回答做了一点优化,详细说了一下)说一下布隆过滤器为什么你项目说布隆过滤器比分布式锁好,怎么比较的先更数据库再删缓存怎么保证一致性(我提了一嘴会有短暂不一致)短暂不一致怎么办(不会)如果删除缓存的过程中出现问题怎么办(我提到用canal读binlog到消息队列)如果缓存是新的,消息队列的数据是旧的怎么办(寄,只说了个乐观锁,不知道怎么实现)分表怎么考虑的数据量怎么考虑的,做测试的时候数据库表里有多少数据(偷懒没做,牛友们别学我)redis怎么保证数据不丢失aof、rdb写时复制会阻塞吗rdb不就是个快照吗,数据修不修改跟它有啥关系(这个没太理解,面试官让我再看看)bigKey了解吗,会有什么问题Innodb和MylSAM的区别三层的B+树存储的数量级是多少普通索引的过程联合索引是一棵树吗你项目上的消息队列幂等怎么做的手撕:1、冒泡排序和优化(优化面试官觉得不行)2、一个n+1长度的数组,范围1-n,只有一个重复2次,说解题思路(Hash,循环、环形链表、相加再减、异或位运算都说了,实在想不出来了)反问:大概什么时候出结果(一周)腾讯云主要什么语言(python和go,java很少)腾讯现在hc多吗(不清楚,他们面的话就有)总结:问了面腾讯云的同学面经,一直在看计网和操作系统,mysql和redis快忘光了,秋招再战
点赞 评论 收藏
转发
9 18 评论
分享
牛客网
牛客企业服务