闲话REST(二)对资源标识符的一点认识

2024-04-30 11:38

本文主要是介绍闲话REST(二)对资源标识符的一点认识,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者: Nyyrikki  来源: 博客园  发布时间: 2013-08-06 15:00  阅读: 323 次  推荐: 1   原文链接   [收藏]  

  闲话REST(一)

  记得有一位朋友曾经问过我这样一个问题:是不是无论传递什么东西都靠URI参数来做,就一定是符合REST风格的。我当时没有完全理解他的意思,便给了他一个现在看来不甚满意的回复。后来当我理解他的意思后,仔细考虑了产生这个问题的原因,觉得这是由于对在REST中URL所承担职责的一些误解造成的,那么在闲话REST的第二篇里我就来谈谈REST中资源的标识与发现。我会将自己对基于HTTP和URI的REST架构实现中资源标识符的理解和认识与大家分享,包括URI在REST中的角色和作用以及怎样去看待查询字符串,同时也希望能借此机会给那位朋友一个满意的解释。另外,由于“基于HTTP和URI的REST架构实现”这个名称过于罗嗦(尽管它是准确的说法),本文接下来提到REST便是特指这一实现,然而正像我在前一篇里所说的,REST是一组设计需求集合,它作为一个抽象层面的架构风格不依赖于任何实现细节。

  REST是面向资源的,而每个资源之所以被称作为资源是因为他们能够被识别和利用,这便是统一资源标识符(Universal Resource Identifier)被设计和如此命名的缘由。URI是网络上任何一个对象的名字,而它也仅仅是一个名字而已。URI的功能也正像人名一样,我们可以到公安局通过姓名查找一个人的详细信息,可以用人名来在与朋友的聊天中指代一个人,而对于这个名字的拥有者来说,他通过名字让别人知道了他的存在,也给了别人称呼他的方法。到网络世界里,URI就好比是资源的名字,它被用来标识、引用和查找资源,与现实世界中人名不同的是在网络上URI不会重复。一个人可以有多个名字,同样的一个资源也可以有多个指向它的URI,但是在假设不存在同名同姓的情况下,一个名字只能指代一个人,所以一个URI不允许同时指向两个资源。

  URI中的查询字符串也许是误解产生的根源,从表面上看他们似乎将引用一个URI看作是远程过程调用的一个便利写法。虽然在我们过去基于RPC的编程模式下,这样的认识更加自然,但这却违背了URI设计的初衷。RPC是面向活动或方法的,无论这一方法是一个对象的成员方法还是全局方法,我们习惯了通过客户端传递参数给他们然后获得返回值的模式,但到了面向资源的模式中,这样的认识便成了理解REST的障碍。对URI本身的“操作” 只存在两种:referencing和dereferencing,前者引用一个URI来指代一个资源,后者表示了通过URI来取回实际对象的命令,而这一命令的执行是通过HTTP请求完成的。现在我们再以现实生活中的人名来类比一下,在现实世界里,无论我们喊一个人的名字多少次,这个人本身不会改变,他与名字的关系也不会改变。所以在网络中,无论我们引用一个URI多少次,其指向的逻辑对象也不应该改变。查询字符串是URI的一部分,包含查询字符串的URI也具有相同的性质。举例来说,http://www.google.com/search?q=REST&start=40永远都表示着“Google中搜索REST结果从第40条开始的若干记录”这一对象,无论引用多少次这一逻辑对象本身都不会改变。这便是URI的幂等性,而这一性质意味着包含查询字符串的URI的确可以理解为某种方法调用,但是此类方法调用必须在逻辑上不改变URI所指向的对象。比如这样的 URI:http://www.restsample.com/add?title=RESTWIKI,这个URI假设它只被用于POST操作,而每一次对它引用返回的(如果有返回值)都是一个新建的资源,而其本身不指向任何资源。在RPC中对查询字符串诸如此类对URI的应用,都是由于仅将HTTP作为一个传输协议来使用造成的,作为传输协议的HTTP仅有request和response两个操作,而为了用这两个操作去模拟企业应用中的CRUD,人们便想到了查询字符串。但是在REST中,HTTP回到了其应用层协议的地位,对资源的CRUD操作使用HTTP原语来完成,所以REST中的URI也只需担当它原本的角色,即资源标识与查找。

  那么我们回到本文开始时那位朋友的问题:是不是无论传递什么东西都靠URI参数来做,就一定是符合REST风格的架构?显然不是,而且在REST中传递什么东西都靠URI参数本身就是一种错误的做法,URI在REST中的作用只是标识和发现资源,它被这样设计的目的是为了满足REST这组约束集合中的约束,是REST决定了URI的使用方式,仅仅依靠URI的使用方法去界定一个架构风格是否为REST是不妥的。

  REST中的URI使得其指代对象是可缓存的,比如上面那个Google搜索的例子,由于其结果在短时间内不会改变,所以该URI可以被当作KEY缓存此对象。而如果URI隐含了改变对象的意思,那么这样的缓存机制就必须通过其他方式实现。另外,从资源角度出发设计的URI往往会产生对SEO更友好的结果,URI可以被看作资源的一个最简要描述,也可以在其中包含所优化的关键字。

这篇关于闲话REST(二)对资源标识符的一点认识的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/948770

相关文章

一份LLM资源清单围观技术大佬的日常;手把手教你在美国搭建「百万卡」AI数据中心;为啥大模型做不好简单的数学计算? | ShowMeAI日报

👀日报&周刊合集 | 🎡ShowMeAI官网 | 🧡 点赞关注评论拜托啦! 1. 为啥大模型做不好简单的数学计算?从大模型高考数学成绩不及格说起 司南评测体系 OpenCompass 选取 7 个大模型 (6 个开源模型+ GPT-4o),组织参与了 2024 年高考「新课标I卷」的语文、数学、英语考试,然后由经验丰富的判卷老师评判得分。 结果如上图所

关于如何更好管理好数据库的一点思考

本文尝试从数据库设计理论、ER图简介、性能优化、避免过度设计及权限管理方面进行思考阐述。 一、数据库范式 以下通过详细的示例说明数据库范式的概念,将逐步规范化一个例子,逐级说明每个范式的要求和变换过程。 示例:学生课程登记系统 初始表格如下: 学生ID学生姓名课程ID课程名称教师教师办公室1张三101数学王老师101室2李四102英语李老师102室3王五101数学王老师101室4赵六103物理陈

加载资源文件失败

背景         自己以前装了一个海康的深度学习算法平台,试用期是一个月,过了一个月之后,因为没有有效注册码或者加密狗的支持了导致无法使用,于是打算卸载掉,在卸载一个软件的时候,无论是使用控制面板还是软件自带的卸载功能,总是卸载不掉,提示“加载资源文件失败”。该软体主要包括以下两部分: 用自带卸载功能卸载的时候分别提示如下:     用控制面板卸载的时候反应很慢,最后也是提示这个

认识LangChain

介绍 LangChain 是一个用于开发由大型语言模型(LLM)支持的应用程序的框架。LangChain使得构建LLM应用更简单,大致三个阶段: 开发阶段 Conceptual guide | 🦜️🔗 LangChainProviders | 🦜️🔗 LangChainTemplates | 🦜️🔗 LangChain使用LangChain的开源构建块和组件构建您的应用程序。使

图形编辑器基于Paper.js教程03:认识Paper.js中的所有类

先来认一下Paper的资源对象,小弟有哪些,有个整体的认识。认个脸。 在Paper.js的 官方文档中类大致有如下这些: 基类: ProjectViewItemPointToolSizeSegmentRectangleCurveCurveLocationMatrixColorStyleTweenToolEventGradientGradientStopEvent 二级或三级类 继承Ite

关于CPU的一点知识

首先说一下,CPU是干啥的: CPU所负责的就是解释和运行最终转换成机器语言的程序内容 我们需要知道的CPU结构:重点需要关注寄存器 运算器 简单说就是负责运算从内存读取到寄存器中的数据,可以看作一个数据加工厂,就是对寄存器中的数据做运算,这些运算包含基本的算术和逻辑运算。 算术逻辑单元(ALU) 这个是运算器中重要的一个组成,主要负责的就是对数据的处理,从而实现对数据的算术和

红队内网攻防渗透:内网渗透之内网对抗:横向移动篇Kerberos委派安全RBCD资源Operators组成员HTLMRelay结合

基于资源的约束委派(RBCD)是在Windows Server 2012中新加入的功能,与传统的约束委派相比,它不再需要域管理员权限去设置相关属性。RBCD把设置委派的权限赋予了机器自身,既机器自己可以决定谁可以被委派来控制我。也就是说机器自身可以直接在自己账户上配置msDS-AllowedToActOnBehalfOfOtherIdentity属性来设置RBCD。 所以核心就是谁或什么权限能修改

按顺序加载外部资源js css

cmmon.js /*** 公共js文件* 内置参数说明:* locationUrl:硬盘路径(开发模式使用)* ytRootUrl:系统根目录,引入该js文件后可直接使用* initJq:自定义jq文件的目录,如果需要引用不同的jq文件,请修改目录。* initCssUrl:初始化css文件容器,如果需要新增或修改引入的c

蔚蓝资源包和数据分析

代码如下 /* ==================================* COMPUTER GENERATED -- DO NOT EDIT* ==================================*/#include <windows.h>static FARPROC __Init_Fun_2__;int __RestartAppIfNecessary__Fun(

ARC学习(3)基本编程模型认识(三)

笔者来介绍arc的编程模型的中断流程和异常流程 1、中断介绍 主要介绍一下中断进入的流程,包括需要配置的寄存器等信息。 中断号:16-255,总共240个中断。触发类型:脉冲或者电平触发中断优先级:16个,0最大,15最小。中断向量表地址:地址0x400对齐,因为中断+异常的地址总共大小占用0x400的字节中断向量大小:32位 1.1 中断配置流程 配置全局优先级阈值,STATUS