RESTful概念理解
基础
REST 定义了一组体系架构原则,您可以根据这些原则设计以系统资源为中心的 Web 服务,包括使用不同语言编写的客户端如何通过 HTTP 处理和传输资源状态。
如果考虑使用它的 Web 服务的数量,REST 近年来已经成为最主要的 Web 服务设计模型。 事实上,REST 对 Web 的影响非常大,由于其使用相当方便,已经普遍地取代了基于 SOAP 和 WSDL 的接口设计。
REST 这个概念于 2000 年由 Roy Fielding 在就读加州大学欧文分校期间在学术论文“Architectural Styles and the Design of Network-based Software Architectures”(请参见参考资料以获取此论文的链接)首次提出,他的论文中对使用 Web 服务作为分布式计算平台的一系列软件体系结构原则进行了分析,而其中提出的 REST 概念并没有获得现在这么多关注。 多年以后的今天,REST 的主要框架已经开始出现,但仍然在开发中,因为它已经被广泛接纳到各个平台中,例如通过 JSR-311 成为了 Java™ 6 不可或缺的部分。
本文认为,对于今天正在吸引如此多注意力的最纯粹形式的 REST Web 服务,其具体实现应该遵循四个基本设计原则:
- 显式地使用 HTTP 方法(GET、
PUT
、POST
、DELETE
)。 - 无状态。
- 公开目录结构式的 URI。
- 传输 XML、JavaScript Object Notation (JSON),或同时传输这两者。
参考:http://www.ibm.com/developerworks/cn/webservices/ws-restful/
RESTful 服务
REST 描述了可用来实现联网系统的一种设计模型。REST 既不是一种技术也不是一种标准;它是用来通过 Web 公开资源的一种架构风格。RESTful 架构遵从以下几个原则:
请求是客户-服务器 式的,并很自然地使用一种基于拉的交互风格。对组件的使用会从服务器中拉出状态的表示。
请求是无状态的。每个从客户端到服务器端的请求都必须包含理解此请求所需的全部信息,而且不能利用服务器上所存储的上下文。
REST 并不一定就意味着在中间层没有任何状态;为实现对某资源的请求的这个状态并不依赖于该状态。
客户机和服务器都遵从统一的接口。所有的资源都可通过 Web 扩展的 SOA 世界中的普通接口进行访问 —— HTTP 及 HTTP 方法:GET、POST、PUT 和 DELETE。
客户机与命名的资源进行交互。此系统由使用 URL(比如 HTTP URL)命名的资源组成。
REST 是表示 Web 中的服务的关键技术。REST 在公开基于数据的服务方面效果最好,理解这一点非常重要。这些数据服务进而可以混合和匹配以便构建新的应用程序(通常称为 mashup)。如下的示例展示了客户机是如何对待 RESTful 服务的。
用 http://<host>/customer:
GET:返回客户列表
POST:创建客户记录
用 http://<host>/customer/roland:
GET:返回 Roland 客户记录
PUT:更新 Roland 记录
DELETE:删除 Roland 记录
在本例中,所公开的资源是 Customer。此 Customer 用 URI /customer 表示。特定的客户则通过在 Customer 之后追加标识符加以表示,例如 /customer/ims。HTTP 报头方法定义了访问此资源的意图。
参考:https://www.ibm.com/developerworks/cn/web/i-zero1/
何为 REST?
RESTful
REST (Representation State Transfer) ful 就是 fulfil(履行, 满足, 完成, 落实, 兑现, 实践)
REST 是设计基于命名资源 — 例如,以 Uniform Resource Locators(URL)、Uniform Resource Identifiers(URI)和 Uniform Resource Names(URN)的形式 — 而非消息的松耦合 Web 应用程序的一种风格。REST 巧妙地借助已经验证过的成功的 Web 基础设施 — HTTP。换句话说,REST 利用了 HTTP 协议的某些方面,例如 GET
和 POST
请求。这些请求可以很好地映射到标准业务应用程序需求,诸如创建、读取、更新和删除(CRUD),如表 1 所示:
表 1. CRUD/HTTP 映射
应用程序任务 | HTTP 命令 |
---|---|
创建 | POST |
读取 | GET |
更新 | PUT |
删除 | DELETE |
请求就像是动词,而资源就像是名词,把两者相关联就形成了对行为的逻辑表达 — 例如, GET
这个文件,DELETE
那条记录。
真正的 REST 之父 Roy Fielding 在他的博士毕业论文中陈述到:REST “强调组件交互的可伸缩性、界面的普遍性、独立部署组件以及使用中间组件来减少交互延迟,增强安全性并封装遗留系统”(参见 参考资料)。构建 RESTful 系统并不难,且这样的系统具有高度的可伸缩性,同时与底层数据松散耦合;这样的系统还可以很好地利用缓存。
Web 上所有的东西(页面、图像等)本质上都是资源。而 REST 正是基于命名资源而非消息的,这就限制了底层技术的曝光,从而给应用程序设计中的松耦合提供了便利条件。例如,下面的 URL 在不暗示任何底层技术的情况下,公开了资源:http://thediscoblog.com/2008/03/20/unambiguously-analyzing-metrics/。
该 URL 表示一个资源 — 一篇名为 “Unambiguously analyzing metrics” 的文章。请求该资源就会调用 HTTP GET
命令。注意该 URL 是基于名词的。基于动词的版本(大概类似 http://thediscoblog.com/2008/03/20/getArticle?name=unambiguously-analyzing-metrics)会违反 REST 原则,因为它以 getArticle 的形式嵌套了一条消息。您也可以设想通过 HTTP 的 POST
命令来发布一个新资源,(比如说,一篇诸如 http://thediscoblog.com/2008/03/22/rest-is-good-for-you/ 的文章)。你还可以设想用关联的、基于动词的 API — 如 createArticle?name=rest-is-good-for-you and deleteArticle?name=rest-is-good-for-you — 这样的调用来拦截 HTTP GET
命令,并最大限度地忽略已有的(并且是成功的)HTTP 基础设施。换句话说,它们不是 RESTful 风格。
REST 的魅力在于任何东西都可以成为资源,且表示方法也可以不同。在前面的例子中,资源为一个 HTML 文件,因此,其响应可能是 HTML 格式的。但是资源也可以是一个 XML 文档、序列化的对象或者 JSON 表示。其实,这些都无关紧要。重要的是资源被命名了,并且与它通信不会影响其状态。不影响状态是很重要的,因为无状态的交互有利于可伸缩性。
它的价值在那里?
引用达芬奇的一句名言 “简洁就是终极复杂”。万维网的实现非常简单,并且无可置否地获得了成功。REST 正是利用了 Web 的简单性,并因此造就了高度可伸缩的、松散耦合的系统,而且事实证明,这样的系统很容易构建。
正如您所看到的,构建 RESTful 应用程序最难的部分在于确定要公开的资源。解决了这个问题之后,再使用开源 Restlet 框架构建 RESTful Web 服务就是小菜一碟了。
http://www.ibm.com/developerworks/cn/education/java/j-rest/j-rest.html
RESTful概念理解的更多相关文章
- 33.服务之间的调用之RPC、Restful深入理解
33.服务之间的调用之RPC.Restful深入理解 2018年05月08日 01:52:42 郑学炜 阅读数 13577更多 分类专栏: 6.框架 版权声明:本文为博主原创文章,遵循CC 4.0 ...
- Ceph 概念理解
简介 Ceph是一个可靠地.自动重均衡.自动恢复的分布式存储系统,根据场景划分可以将Ceph分为三大块,分别是对象存储.块设备存储和文件系统服务. 在虚拟化领域里,比较常用到的是Ceph的块设备存储, ...
- 对restful的理解
最近在学习web api,从而涉及到了restful风格,我的理解是restful风格,每个链接都会对资源进行相应的操作(CRUD),如果一个链接不包含资源,则可能不符合restful风格,借此想请教 ...
- 大数据核心知识点:Hbase、Spark、Hive、MapReduce概念理解,特点及机制
今天,上海尚学堂大数据培训班毕业的一位学生去参加易普软件公司面试,应聘的职位是大数据开发.面试官问了他10个问题,主要集中在Hbase.Spark.Hive和MapReduce上,基础概念.特点.应用 ...
- SpringIOC的概念理解、构造器注入、setter注入、p命名空间注入、IOC容器介绍与比较
1.IOC概念理解 IOC(Inversion of Control)即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象 ...
- Kubernetes重要概念理解
Kubernetes重要概念理解 kubernetes是目前最主流的容器编排工具,是下一代分布式架构的王者.2018年的kubernetes第一个版本1.10已经发布.下面整理一下,kubernete ...
- Restful的理解,Restful 优缺点
写一下我对restful的理解,最近换工作面试的时候有问到我restful api的东西,工作中以前很多项目也是webapi + js前台控件的形式构建系统.实际上感觉restful太“理想化”,用起 ...
- SNF快速开发平台2019-角色、权限、账户的概念理解-非常全的理论讲解权限控制
组织模型 资源模型 操作模型 谁能够执行哪些操作 执行资源的范围 资源概念资源就是想要的到的最终物质,我们可以给每一个资源定义一个权限,也可以给某一类资源定义一个权限 权限概念权限是对资源 ...
- elasticsearch基本概念理解+elasticsearch 的shards unassigned处理方法 -- 最佳运维实践 - 集群规划
1.es与MySQL的概念对比 2.概念理解 2.1 Index : 一个索引即是文档的集合 2.2 Document : 一个文档即是一个可被索引的基础单元信息,一条记录: 2.3 Replicas ...
随机推荐
- 全连通图求最小生成树边权之积(邻接矩阵/prim/kruskal)
Description 大家都知道最小生成树一般求的是构成最小生成树的边的权值之和. 现在请求构成最小生成树的边的权值之积 S,最终结果请输出 (S % 100003). P.S. 点之间的边为无向边 ...
- list列表常用方法
列表是Python中常用的功能,我们知道,列表可以用来存储很多信息,掌握列表的功能有助于我们处理更多的问题,下面来看看列表都具有那些属性: 1.append(self,p_object) de ...
- 查看loadrunner运行日志
查看loadrunner运行日志 日志分两种 1.在VUGEN中运行后的日志 2.在controller中运行后的日志日志设置分两步: 1.首先,在VUGEN或controller中run-tim ...
- ElasticSearch部署文档(Ubuntu 14.04)
ElasticSearch部署文档(Ubuntu 14.04) 参考链接 https://www.elastic.co/guide/en/elasticsearch/guide/current/hea ...
- Java利用Redis实现消息队列
应用场景 为什么要用redis?二进制存储.java序列化传输.IO连接数高.连接频繁 一.序列化 这里编写了一个java序列化的工具,主要是将对象转化为byte数组,和根据byte数组反序列化成ja ...
- Openstack关于Regions和Availability Zones
在AWS中有Region和Availability Zones的概念,并且在openstack中也实现了两者,只是不太容易看出来. 此文主要介绍他们的概念和关系,以及在openstack中的实现. 如 ...
- java 安全 技术
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha 加密对应的类 是 Cipher ,意思 是加密的意思.这个类 在 javax.cryp ...
- 【四边形不等式】noi95- 合并石子
[题目大意] 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分.试设计出1个算法,计算出将N堆石子合并成 ...
- JNI介绍
JNI是在学习Android HAL时必须要面临一个知识点,如果你不了解它的机制,不了解它的使用方式,你会被本地代码绕的晕头转向,JNI作为一个中间语言的翻译官在运行Java代码的Android中有着 ...
- noip2009最优贸易
试题描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双 ...