闲话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

相关文章

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

49个权威的网上学习资源网站

艺术与音乐 Dave Conservatoire — 一个完全免费的音乐学习网站,口号是“让每一个人都可以接受世界级的音乐教育”,有视频,有练习。 Drawspace — 如果你想学习绘画,或者提高自己的绘画技能,就来Drawspace吧。 Justin Guitar — 超过800节免费的吉他课程,有自己的app,还有电子书、DVD等实用内容。 数学,数据科学与工程 Codecad

SpringMVC-1.认识及配置

SpringMVC是一个基于请求驱动的Web框架,和structs一样是目前最优秀的基于MVC框架,现在的项目一般都使用SpringMVC代替Structs。 MVC模式中,Model是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象在数据库中存取数据。View是应用程序中处理数据显示的部分,通常视图是依据模型数据创建。Controller是应用程序中处理用户交互的部分。通常控制器负责从视

【H2O2|全栈】关于HTML(1)认识HTML

HTML相关知识 目录 前言 准备工作 WEB前端是什么? HTML是什么? 如何运行HTML文件? 标签 概念 分类 双标签和单标签 行内标签和块标签 HTML文档结构 预告和回顾 UI设计相关 Markdown | Md文档相关  项目合作管理相关  后话 前言 本系列的博客将分享前端HTML的相关知识点。 本篇作为本系列的第一期博客,主要讲解H

汇编:嵌入式软件架构学习资源

成为嵌入式软件架构设计师需要掌握多方面的知识,包括嵌入式系统、实时操作系统、硬件接口、软件设计模式等。 以下是一些推荐的博客和网站,可以帮助你深入学习嵌入式软件架构设计: ### 1. **Embedded.com**    - **网址**: [Embedded.com](https://www.embedded.com/)    - **简介**: 这是一个专注于嵌入式系统设计的专业网

认识鬼火引擎

一、Irrlicht简介 (1)概念Irrlicht引擎是一个用C++书写的高性能实时3D引擎,可以应用于C++程序或者.NET语言中。通过使用Direct3D(Windows平台)、OpenGL 或它自己的软件着色程序,可以实现该引的完​全跨平台。尽管是开源的,该Irrlicht库提供了可以在商业级的3D引擎上具有的艺术特性,例如动态的阴影,粒子系统,角色动画,室内和室外技术以及碰撞检测等。(

Jenkins--pipeline认识及与RF文件的结合应用

什么是pipeline? Pipeline,就是可运行在Jenkins上的工作流框架,将原本独立运行的单个或多个节点任务连接起来,实现单个任务难以完成的复杂流程编排与可视化。 为什么要使用pipeline? 1.流程可视化显示 2.可自定义流程任务 3.所有步骤代码化实现 如何使用pipeline 首先需要安装pipeline插件: 流水线有声明式和脚本式的流水线语法 流水线结构介绍 Node:

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光

Unity 资源 之 Super Confetti FX:点亮项目的璀璨粒子之光 一,前言二,资源包内容三,免费获取资源包 一,前言 在创意的世界里,每一个细节都能决定一个项目的独特魅力。今天,要向大家介绍一款令人惊艳的粒子效果包 ——Super Confetti FX。 二,资源包内容 💥充满活力与动态,是 Super Confetti FX 最显著的标签。它宛如一位