restful 对于REST中无状态(stateless)的一点认识

理解REST与RESTful:它们有何不同? REST(Representational State Transfer,表述性状态转移)是一种软件架构风格,用于设计网络应用程序的架构。它由Roy Fielding在2000年的博士论文中首次提出。REST并不是一种协议,而是一组约束和原则,旨在创建可扩展、性能高且易于维护的Web服务。RESTful是指遵循REST架构风格设计的Web服务。换句话说,RESTful API是实现了REST原则和约束条件的API。 阅读详情

今天早上在Yahoo的邮件列表里看到一篇颇有意思的讨论,标题为RESTful vs. unRESTful: Session IDs and Authentication(51CTO编者注:意为REST对非REST,Session ID与验证)。文中让发起讨论的朋友大惑不解的是这样一个问题:为什么在请求中传递SessionID被普遍认为是unRESTful的,而将用户的credentials包含在每个请求里又是一种非常RESTful的做法。看了他接下来对于REST架构风格中"statelessness"属性的理解后,我觉得有必要对这个经常会被人误解词汇以及相关概念做一个简要的整理,希望能够通过这篇随笔解释清楚什么是状态,为什么要实现无状态,以及REST风格架构中的两种状态的区别,最后我会从我的理解出发来回答作者提出的这个问题。

首先,一个Web应用程序协议的“状态”在通常指的是为两个相互关联的用户交互操作保留的某种公共信息,它们常常被用来存储工作流或用户状态信息等数据。这些信息可以被指定不同的作用域如page,request,session或全局作用域,而存储他们的责任也同样可以由Client端或Server端负责。虽然存储状态为企业软件开发带来了诸多便利,但是它也给分布式系统的其他方面带来了许多限制,比如在负载均衡方面,在有状态的模式下,一个用户的请求必须被提交到保存有其相关状态信息的服务器上,否则这些请求可能无法被理解,这也就意味着在此模式下服务器端无法对用户请求进行自由调度。于此相关的另一个问题是容错性,倘若保有用户信息的服务器宕机,那么该用户最近的所有交互操作将无法被透明地移送至备用服务器上,除非该服务器时刻与主服务器同步全部用户的状态信息。此外,由于HTTP本身不是一个有状态的协议,开发人员必须通过模拟实现状态的钝化与激活等。于是为了克服这些不足,无状态(Statelessness)架构风格属性受到了广泛关注。

无状态指的是任意一个Web请求必须完全与其他请求隔离,当请求端提出请求时,请求本身包含了相应端为相应这一请求所需的全部信息。这一约束的出现改善了分布式系统的可见性、可靠性以及可伸缩性,具体的介绍可以参考Roy T. Fielding博士的论文,这里就不哆嗦了。这些从整个系统角度来看无状态似乎过于抽象,那么对于用户来说,怎么感觉的有状态与无状态的差别呢。简单的方法是浏览器的后退按钮,如果一个网站期望用户以A->B->C的流程来交互,而在执行至B时回退的话,那么系统很有可能不是按照其所期望的方式运行,因为用户的状态可能被不可逆地修改了。反过来,搜索引擎(我指的是普通意义上的搜索引擎,而不是根据用户搜索历史个性化了的)是一个无状态架构的范例。任何用户可以在浏览器地址栏中输入http://www.google.com/search?q=RESTful&start=100来获得从第一百条开始的关于RESTful的记录,并且当Google摩洛哥服务器瘫痪时,相关用户请求会被透明地移送至其他服务器。

一切似乎很明了,那么是什么导致了那位朋友的误解呢,答案是RESTful架构对于state的两个不同的解释: 应用状态(Application State)和资源状态(Resource State)。应用状态指的是与某一特定请求相关的状态信息,而资源状态则反映了某一存储在服务器端资源在某一时刻的特定状态,该状态不会因为用户请求而改变,任何用户在同一时刻对该资源的请求都会获得这一状态的表现(Representation)。RESTful架构要求服务器端不保有任何与特定HTTP请求相关的资源,所以应用状态必须由请求方在请求过程中提供。那么再回到那个邮件列表中的问题,为什么传递一个session ID是违背REST架构风格而传递user credentials却不是。我想作者的疑惑源于他没有分清什么是有状态和无状态的架构属性,而认为“传递某种表示状态的信息”到服务器便是“有状态”的表现。其实有状态和无状态与请求本身没有多大关联,重要的是状态信息是由请求方还是响应方负责保存。在Session ID可以被认为是一个用来标识某一会话状态的Key,将其传递给服务器端意味着这样一个请求:“请帮我取出这个状态信息”,也就是说这个请求假设响应方保有着状态信息。由于与某一特定请求相关的状态属于应用状态,而RESTful架构要求任何此类状态由请求方负责提供,所以传递Session ID被认为是unRESTful的做法。反过来,user credential作为一种应用状态,是被期望由请求方提供的,所以在请求中传递user credentials(姑且忽略安全性问题)是符合RESTful架构规范的。

这篇随笔或多或少散发着某种纯粹主义的味道,但我觉得有些概念是值得玩味的。任何一种架构风格的出现都有其期望的,对现有方案的改进或期望克服的问题。作为REST来说,它所期望的是组件的可伸缩性,组件的独立部署,接口统一等特性,而无状态作为实现这组需求的一个特性,个人认为是有必要清楚了解并实际开发过程中落实的。

 

原文

http://developer.51cto.com/art/200906/129424.htm

REST,以及RESTful的讲解 1.传统下的API接口   http是目前在互联网上使用最多的协议,没有之一。   可是http的创始人一直都觉得,在过去10几年来,所有的人都在错误的使用Http.这句话怎么说呢?   如果说你要删除一个数据,以往的做法通常是 delete/{id}    如果你要更新一个数据,可能是Post数据放Body,然后方法是 update/{id}, 或者是artichle/{id}?meth... 阅读详情

相关推荐

实战指南:将MediaPipe封装为Windows DLL,实现C++/C#高效调用

在计算机视觉和多媒体处理领域,跨平台框架为开发者提供了强大的算法模型和计算能力。其核心原理在于通过预训练的机器学习模型和优化的计算图,实现对图像、视频流中特定目标(如人脸、手势、姿态)的实时检测与分析。这项技术的价值在于能够将复杂的AI能力模块化,降低应用开发门槛。在实际工程实践中,为了突破特定语言生态的限制并优化部署流程,开发者常需将核心功能封装成独立的库。例如,将Google的MediaPipe框架封装为Windows动态链接库(DLL),就是一个典型的工程实践。此举能有效解决语言壁垒和部署简化问题,使

weixin_28691741的博客 360

对于REST中Statelessness的一点认识

今天早上在Yahoo的邮件列表里看到一篇颇有意思的讨论,标题为RESTful vs. unRESTful: Session IDs and Authentication(http://tech.groups.yahoo.com/group/rest-discuss/message/12870)。文中让发起讨论的朋友大惑不解的是这样一个问题:为什么在请求中传递SessionID被普遍认为是...

a7859574的博客 386

从原理到调试:手把手教你用Matlab解码互补格雷码与相移码(附数据与常见错误排查)

本文详细介绍了如何使用Matlab解码互补格雷码与相移码,涵盖从原理到调试的全过程。通过实际案例和代码示例,帮助读者掌握结构光三维重建中的相位解包裹技术,并提供了常见错误排查与优化建议,提升解码效率与准确性。

weixin_29090917的博客 219

REST API 详解

REST(Representational State Transfer,表述性状态转移)是一种用于构建分布式系统的架构风格。REST API(Application Programming Interface,应用程序接口)是一种基于REST风格的网络API,通常用于Web服务中。REST API使用常见的HTTP方法(如GET、POST、PUT、DELETE等)与Web服务交互,通过URI(Uniform Resource Identifier,统一资源标识符)定位资源。

qq_39321234的博客 1万+

Python连接StarRocks全流程实践: SQL文件调用与Pandas混合优化

通过这种分阶段混合计算, 既能发挥StarRocks处理海量数据的性能优势, 又能保留Pandas在内存计算中的灵活性, 实现效率与功能的完美平衡.结合SQL的高效聚合与Pandas的灵活计算, 实现查询和数据处理的深度融合.该库基于SQLAlchemy 2.x开发, 仅支持Python 3.x环境.对大批量数据的写入, 建议进行分块. 分块写入较单条插入速度会有显著提升.这样可以避免python代码的查询与SQL耦合, 支持版本化管理.将DDL, DML分离为独立文件, 例如。: 调整连接复用参数。

t.y.Tang的博客 2780

arcgis select by attributes一次选多个_视频:如何基于ArcGIS与GeoDa求莫兰指数和绘制莫兰散点图?...

莫兰指数是全域莫兰指数(Global Moran's I)的简称,是澳大利亚统计学家帕特里克·阿尔弗雷德·皮尔斯·莫兰(Patrick Alfred Pierce Moran),在1950年提出的。详细介绍,如下:莫兰指数取值范围在-1.0至1.0之间。当Moran's I >0时,表示空间正相关性,其值越大,空间相关性越明显;当Moran's I <0时,表示空间负相关性...

weixin_39948247的博客 1760

如何理解“RESTfulAPI是无状态的

在REST应用程序中,每个请求必须包含服务器需要理解的所有信息,而不是依赖于服务器记住先前的请求。 在服务器上存储会话状态违反了REST体系结构的无状态约束。因此,会话状态必须完全由客户端处理。

芙蓉帐暖的博客 852

黑猫带你学eMMC协议第14篇:eMMC FFU详解(Field Firmware Update)

1 前言 1.1 声明 本文依据eMMC JEDEC5.1及个人工作经验整理而成,如有错误请留言。 本文结合eMMC JEDEC5.1协议手册查看效果更佳。 1.2 内容提要 1、ffu相关寄存器有哪些? 2、如何设置ffu? 3、什么是ffu?是否能够更新旧版本的固件到emmc? 4、ffu配置流程图。 2 什么是FFU 主机下载新的固件到eMMC,下载成功后eMMC将固件安装到设备。 3 相关寄存器/命令 SUPPORTED_MODES [493] FFU_FEATURES [492] 该

黑猫奥利奥的博客 4658

shiro 前后端分离解决跨域 以及 自定义ShiroSessionManager 校验请求头的JsessionId

shiro 前后端分离解决跨域 以及 自定义ShiroSessionManager 校验请求头的JsessionId 1.解决跨域 import org.apache.shiro.web.servlet.OncePerRequestFilter; import org.springframework.stereotype.Component; import javax.servlet.Fi...

llllllStan 1023

【纯干货分享】常用高速接口眼图模板合集

文章汇集了常见的高速接口的信号眼图测试模板技术要求,比如,LPDDR5/4、PCIe 5.0/4.0、USB、MIPI等等,方便工程师快速进行查询和使用。

一只豌豆象的博客 3116

electron:解决打包后报错Cannot find module ‘X‘ 运行报错各种模块缺失问题(解决electron build打包后运行应用报错启动失败或白屏,无论模块名称是什么都能解决!)

Electron app打包后启动报错:“Cannot find module 'X'”解决方案,electron-builder 打包出现 cannot find module,electron 打包后找不到module问题,electron打包运行白屏、Can not find modules ‘x‘,electron项目打包报错,electron打包后,点击生成的exe应用程序出现Cannot find module,解决electron-build打包后运行app报错:cannot find mod

✅ 精选推荐文章 4385

REST无状态风格的理解

推荐一篇博文 ,这个介绍的很详细,很好理解(点击跳转) "Statelessness" 是restful风格最重要的原则。它的含义是指,客户端和服务器交互的过程中(各次请求之间)是无状态的。无状态通信要求在网络通信过程中,任意一个Web请求必须与其他请求隔离,当请求端提出请求时,请求本身包含了响应端为响应这一请求所需的全部信息。 一个WEB应用协议中的“状态”指的是,为两个相互关...

weixin_33915554的博客 361

手把手教你学PCIE--PCIe架构详解 - 物理层结构

在前一篇文章中,我们对PCIe与其他总线协议进行了对比分析。本文将深入探讨PCIe的物理层结构,这是PCIe协议的核心组成部分之一。物理层负责实际的电气信号传输,理解其工作原理对于设计和调试PCIe系统至关重要。PCIe的物理层是协议栈的最底层,负责将数据从链路层转换为电信号进行传输,并在接收端将电信号还原为数据。差分信号传输:通过一对差分信号线实现高速、低噪声的数据传输。时钟恢复:从数据流中提取时钟信号以同步收发双方。均衡与预加重:补偿信号在传输过程中的损耗,提高链路可靠性。

MHD0815的博客 362

对于REST中无状态(stateless)的一点认识

今天早上在Yahoo的邮件列表里看到一篇颇有意思的讨论,标题为RESTful vs. unRESTful: Session IDs and Authentication(51CTO编者注:意为REST对非REST,Session ID与验证)。文中让发起讨论的朋友大惑不解的是这样一个问题:为什么在请求中传递SessionID被普遍认为是unRESTful的,而将用户的credentials包含在...

huidaoli 1509

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

什么是REST风格? 什么是RESTFUL?(一篇全读懂)

一、什么是REST ?(一种软件架构风格) 缩写:REST (不是"rest"这个单词) 外文名:Representational State Transfer,简称REST。 中文名:表现层状态转移。 提出时间:2020年。 属性:一种软件架构风格。(以Web为平台的。web服务的架构风格,前后端接口时候用到。) REST之所以晦涩难懂,是因为前面主语(Resource )被去掉了。 全称是: Resource Representational State Transfer。 通俗来讲就是:资源在网络

SeniorShen的博客 6万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

架构之:REST和RESTful

近几年微服务是如火如荼的在发展,而微服务之间的调用和渐渐的从RPC调用转移到了HTTP调用。于是经常听到有些同事说我们提供微服务并且暴露RESTful接口给别的系统,但是什么是RESTful接口呢?它和REST有什么关系呢? 别急,本文将会带你一探究竟。

程序那些事 3555

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

理论与实例,准确理解REST的无状态设计

如何理解REST的无状态设计? REST和RESTFUL是什么关系?区别是什么?

一学就明的博客 7981

REST和RESTful有什么区别

REST系统和RESTful系统之间有什么区别? 从我最常阅读的几件事中,所谓的REST服务实际上就是RESTful服务。 那么两者之间有什么区别。

p15097962069的博客 809

restful架构 无状态stateless理解

REST(英文:Representational State Transfer,简称REST)描述了一个架构样式的网络系统.   1,一个原则是分层系统,这表示组件无法了解它与之交互的中间层以外的组件。通过将系统知识限制在单个层,可以限制整个系统的复杂性,促进了底层的独立性。   2,另一个重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请...

FzBcumt的专栏 629

什么是REST ? 什么是RESTful?

REST (REpresentation State Transfer) 描述了一个架构样式的网络系统,指的是一组架构约束条件和原则。 RESTful 指的是满足这些约束条件和原则的应用程序或设计。 RESTful service是一种架构模式,它的轻量级web服务,发挥HTTP协议的原生的GET,PUT,POST,DELETE。 REST 并非始终是正确的选择。 它作为一种设计 Web 服...

fengdijiang的专栏 1万+

对于REST的stateless的一点认识

REST里面的无状态 是指的HTTP无状态。而HTTP的无状态 事之服务器没有保存客户端的状态信息(如果保存 一旦这个服务器宕机 我们启用备用服务器 除非这个服务器也同步备份了状态 否则一切都会回到最初的起点 )所以客户端每次要自己带上自己当前的状态区请求服务器。比如说登录 我们通过cookie来通过客户端保持登录状态(这也是为什么cookie在客户端) 那么session算是stateless还是stateful呢? https://zhidao.baidu.com/question/228788699.

Tech in Pieces 381

REST API 与 RESTful API 区别和联系

一、首先理解一下什么是API: API,应用程序接口,也可以叫应用程序界面,或者简称为应用接口。用来实现具体的功能比如说:上司让下属买杯咖啡,上司不管你去哪儿买的,花了多少钱,只管你买到了咖啡没有。这里面上司的指令相当于一个调用api路径,下属买到咖啡送到上司手上就是一个api实现的功能和方法。 二、REST与 RESTful REST,就是一种应用接口的设计风格。RESTful 是 REST 的形容词形式,RESTful API 指的是 REST 风格的接口。一般 REST 与 RESTful 是一个意思

JerryKit的博客 5728
上一篇: restful Web 服务编程,REST 与 SOAP
下一篇: jquery EL表达式
嗯没有名字
博客等级 码龄18年 33粉丝 61原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值