转载自https://zhuanlan.zhihu.com/p/381554129

RESTful架构究竟是什么

别着急,想要了解RESTful,我们先来了解一位大佬Roy Thomas Fielding,一个出生于加州拉古纳海岸的伟大计算机科学家。一个集”HTTP协议(1.0版和1.1版)主要设计者“、"Apache服务器软件作者"、"Apache基金会第一任主席",这三大头衔于一身的伟大男人。

2000年,他在博士论文《Architectural Styles and the Design of Network-based Software Architectures》中首次提出了“REST”的概念。之后,这篇论文受到了广泛的关注,在当时的互联网界掀起了轩然巨波,对互联网的发展产生了深远的影响。

Fielding 所提出的"REST"可以看作是一种互联网软件架构原则,凡是符合REST原则的架构,都可称之为“RESTful"架构。

RESTful的英文全称为Representational State Transfer,直接翻译过来即为“表现层状态转化”,看到这儿,你可能还是不明白,到底什么是RESTful啊?可以用人话表示一下吗?其实“表现层”省略了主语,它指的是“资源”的表现层。下面,我们来慢慢详解有关内容。

1)资源(Resources)

RESTful中的资源指的是,互联网上的一个实体或是一条有价值的信息。资源可以是一段文本、一张图片、一首歌曲、一种服务。每种资源对应着一个特定的URL(Uniform Resource Locator)——统一资源定位符。

URI成为了每一个资源的地址,更像是独一无二的识别符。因此,从这个角度来看,所谓的“上网”,就是调用URL与互联网上的一些“资源”交互。

(2)表现层(Representation)

我们将互联网上,资源所呈现出来各中表现形式,称为它的“表现层”。例如,文本可以由TXT表现,也可由XMLHTMLJSON等形式表现。这些都属于文本的“表现层”。

(3)状态转化(State Transfer)

在访问互联网的过程中,必然存在着客户端和服务器的互动,因此也必然涉及着数据和状态的变化。

另外,互联网的通信协议是基于HTTP的无状态协议。这就意味着,所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,即前台想要访问后台资源时,必须通过一定的方法途径,让服务器端发生"状态转化"(State Transfer)。这种转化又恰好是发生在表现层之上的,所以这个过程就被称之为"表现层状态转化"。

由于基于HTTP协议,客户端来使服务端发生变化的操作也就是常用的GET、POST、PUT、DELETE这四个操作。GET----获取资源,POST----新建资源,PUT----更新资源,DELETE----删除资源。

因此,RESTful用一句话来概括就是”URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作。"

(4)为什么要用RESTful架构?

近年来前端设备层出不穷(手机、平板、桌面电脑、其他专用设备......),不同的前端设备与后端进行通信交互时,每一个都要写上不同的协议吗?

答案当然是不必须的,RESTful正是为解决此问题而诞生的。它可以通过一套统一的接口为 Web,iOS和Android等不同前端提供服务,建立统一的后台管理。

RESTful架构应具备条件

rest服务是一种Web服务架构,其目标是为了创建具有良好扩展性的分布式系统。

rest应该具备以下条件:

  • 使用客户/服务器模型

    (简称C/S结构,是一种网络架构,它把客户端 (Client) 与服务器(Server) 区分开来。 每一个客户端软件的实例都可以向一个服务器或应用程序服务器发出请求。)

    例如前后端分离,页面和服务不在同一服务器上运行。

  • 层次化的系统

    例如一个父系统下有多个子模块,每个模块都是独立的服务。

  • 无状态

    服务端并不会保存有关客户的任何状态,也就是说要服务后端服务,就要带token过去。

  • 可缓存

    例如服务端通过token缓存已登录过的用户信息,客户端请求会带一个token过来,后台服务通过带过来的token在缓存中取出用户信息,提高效率。

  • 统一的接口

    例如,一个项目的所有模块都整合到一起,all-in-one,打成一个包,多个服务,整合到一个端口下。

如果一个系统满足了上面所列出的五条约束,那么该系统就被称为是RESTful的(一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。)

最新文章

  1. WebBrowser处理AJAX生成的网页内容!
  2. Ios学习之容器的理解
  3. iOS UITextField的returnkey点击事件
  4. 嵌入式Linux应用程序开发详解------(创建守护进程)
  5. Codeforces Round #203 (Div. 2) A.TL
  6. ASP.NET MVC4中用 BundleCollection使用问题手记
  7. [工作技能]SVN
  8. CodeForces 546A-Soldier and Bananas
  9. react 不能往组件中传入属性的值为 undefined
  10. unix系统非roo账号安装JDK
  11. Cocos2d-x3.0 TestCPP文件夹的注意事项
  12. lpc1788IO口模拟IIC
  13. 如何减轻ajax定时触发对服务器造成的压力和带宽的压力?ajax-长轮训
  14. Vue入门
  15. iOS 中如何判断当前是2G/3G/4G/5G/WiFi
  16. jdk1.8 HashMap的实现
  17. 【CH5105】cookies 贪心+DP
  18. <context annotation-config />标签意义
  19. TCP/IP知识总结(TCP/IP协议族读书笔记二)
  20. 在linux下安装wordpress

热门文章

  1. elementUI合并表格span-method用法
  2. Vue.js教程 1.前端框架学习介绍
  3. celery config
  4. [luogu3706]硬币游戏
  5. SpringMVC注解搭配环境
  6. 【JQuery】(1)JQuery基础
  7. 基于Docker搭建Maven私服Nexus,Nexus详解
  8. Node.js实现前后端交互——用户注册
  9. ServerBootstrap的handler()和childHandler()区别
  10. Kafka从入门到放弃(一) —— 初识Kafka