阅读更多

1顶
9踩

企业架构

原创新闻 为啥REST如此重要?

2013-08-01 18:31 by 副主编 mengyidan1988 评论(14) 有12326人浏览

本文我们将讨论REST,它定义了一组体系架构原则,您可以根据这些原则设计以系统资源为中心的Web服务,这是一个非常容易让人误解的概念。本文主要是写给那些想设计WebService API但却对REST没有十分清晰认识的开发者们。在本文最后会附上一些资源供大家学习,这些资源讲解非常详细。

什么是REST

表征状态转移(Representional State Transfer),是Roy Fielding( HTTP规范的主要编写者之一)博士在2000年他的博士论文中提出来的一种软件架构风格。它并不是一个标准,而是通过表征(Representional )来描述传输状态的一种原则。其宗旨是从资源的角度来观察整个网络,分布在各处的资源由URI确定,而客户端的应用通过URI来获取资源的表征。获得这些表征致使这些应用程序转变了其状态。随着不断获取资源的表征,客户端应用不断地在转变着其状态。

目前在三种主流的Web服务实现方案中,因为REST模式的Web服务与复杂的SOAP和XML-RPC相对比,更加简洁,越来越多的Web服务开始采用REST风格设计和实现。例如,Amazon.com提供接近REST风格的Web服务进行图书查找;雅虎提供的Web服务也是REST风格的。

让我们来思考一下:

Marcus是一个农民,他有4头牛,12只鸡和3头奶牛。他现在模拟一个REST API,而我是客户端。如果我想用REST来请求当前的农场状态,我仅会问:“State?”Marcus会回答:“4头猪、12只鸡、3头奶牛”。

这是REST最简单的一个例子。Marcus使用表征来传输农场状态。表征的句子很简单:“4头猪、12只鸡、3头奶牛”。

再往下看,看我如何让Marcus用REST方式添加2头奶牛?

按照常理,可以会这样说:Marcus,请在农场你再添加2头奶牛。难道这就是REST方式吗?难道就是通过这样的表征来传输状态的吗?不是的!这是一个远程过程调用,过程是给农场添加2头奶牛。

Marcus很愤怒地响应到:“400,Bad Request”,你到底是什么意思?

所以,让我们重新来一次。我们怎样做到REST方式呢?该怎样重新表征呢?它应该是4头猪、12只鸡、3头奶牛。好,让我们再次重新表征……

我:“Marcus,……4头猪、12只鸡、5奶牛!”

Marcus:“好的”。

我:“Marcus,现在是什么状态?”

Marcus:“4头猪、12只鸡、5头奶牛”。

我:“好!”

看到了吗?就这样简单。

为什么RPC也不够好?

从逻辑角度来看,为什么会更加青睐REST而不是RPC(Remote Procedure Call,远程过程调用 ),因为它极大的降低了我们沟通的复杂度,通过把表征作为唯一的沟通的方式。无需去讨论过程(添加一头牛?增加一种动物类型?给鸡的数量翻倍还是卖掉所有猪?)我们只需讨论表征,并且使用这个表征来达到我们想要的目标,很简单,不是吗?我不希望和Marcus的沟通失败,因为我们彼此的理解过程会不一样,所以只需要知道最后的状态就行。但这仅仅是创建RPC会产生许多问题之一。如果你使用RPC,你需要设计一些程序嵌入到某种结构中。这种结构需要存储参数、错误的代码、返回值等。我已经看到许多公司这样做,他们设计自己的RPC-结构来实现客户端与服务器端的交互,但却产生许多问题。你为什么要这么做?为什么要创建自己的RPC-结构?这样做的好处是?倘若我想要让应用程序使用许多WebService,并且这些WebService带有多个RPC-格式属性?那么我不得不去开发一些类似这样的东西:

如果你们真的需要RPC,至少要选择一个类似SOAP的标准。

但SOAP也很糟糕

即使RPC的标准真的很令人痛苦,但我不得不承认ACID事务,一个完整的标准化服务描述性语言SOAP(Simple Object Access Protocol,简单对象访问协议)在某些环境下表现的还不错。尽管如此,SOAP产品的性能开销很大,它是一个巨大的性能杀手。虽然REST不是一个标准,但在实现RESTful Web服务时可以使用其他各种标准(比如HTTP、URL、XML、PNG等)。

Session更邪恶

你无需Session!但有人会说:“我想要保存用户购物车里的商品,所以我必须要Session!”不,这样想是错误的!即使没有Session,你也可以做你任何你想做的事情。你可以只需在URL里封装购物车信息,或者为购物车创建另一个资源,比如“/carts/5235”。

不需要与客户端进行会话,通过这些操作(指在URL里封装购物车信息,或者为购物车创建另一个资源,比如“/carts/5235”)后,客户端向服务器发出请求后,哪怕你在服务器上执行卸载平台和操作系统、拆除服务器硬件、重新组装服务器、重新安装操作系统、平台、应用程序备份恢复操作,也不会影响客户端。

不要强迫客户端保存状态,这样做不仅复杂,而且还会带来许多问题,你应该从你的Web应用程序里删除有状态的东西。

不要重造超媒体

目前,超媒体已经相当普及,我提醒大家,不要再去重新造轮子。这里已经有许多,足够你使用了:

其他资源

这里还有一些更加深入的资源供你参考使用:

via Why REST is so important

来自: csdn
1
9
评论 共 14 条 请登录后发表评论
14 楼 say4ever2u 2013-10-16 16:40
mysh 写道
rest 的好处在于它动态, 数据处理简单, 而不是上文说的那些不着边的什么表征

是源作者故弄玄虚呢 还是这里翻译有问题  看的晕晕的
13 楼 dohkoos 2013-09-18 21:56
简单才是REST流行的因素。因为使用了HTTP的方法才简单。当然,也可以把REST构建在其它协议之上,但实践中这样使用REST的案例有多少呢?
12 楼 闫老三 2013-08-08 12:28
我就出门打个酱油,不用理我。
11 楼 archerfrank 2013-08-07 14:49
rentianchou 写道
caizi12 写道
JavaCrazyer 写道
freezingsky 写道
娘的,这玩意这么深奥,我一直把REST当成URL更人性化。。。
哈哈,我一直来也是这么理解的

我也是这么理解。难道咱们理解的都太片面?


   我也是

我也是,再加上会用不同的方法 put delete
10 楼 rentianchou 2013-08-07 09:26
caizi12 写道
JavaCrazyer 写道
freezingsky 写道
娘的,这玩意这么深奥,我一直把REST当成URL更人性化。。。
哈哈,我一直来也是这么理解的

我也是这么理解。难道咱们理解的都太片面?


   我也是
9 楼 rox 2013-08-03 12:53
个人理解REST最最重要的就是面向资源!
8 楼 caizi12 2013-08-02 20:53
JavaCrazyer 写道
freezingsky 写道
娘的,这玩意这么深奥,我一直把REST当成URL更人性化。。。
哈哈,我一直来也是这么理解的

我也是这么理解。难道咱们理解的都太片面?
7 楼 JavaCrazyer 2013-08-02 14:28
freezingsky 写道
娘的,这玩意这么深奥,我一直把REST当成URL更人性化。。。
哈哈,我一直来也是这么理解的
6 楼 lianglaiyang 2013-08-02 09:26
真心没听明白什么意思,太深奥了,复杂的事情可不可以简单化呢?
5 楼 freezingsky 2013-08-01 22:19
娘的,这玩意这么深奥,我一直把REST当成URL更人性化。。。
4 楼 dwangel 2013-08-01 22:10
不对,最多应该只返回 5头奶牛
3 楼 dwangel 2013-08-01 22:08
其实应该是
url: /农场
4头猪、12只鸡、3头奶牛

url: /农场/奶牛
method add
param 2

然后返回 success
部分情况下返回 4头猪、12只鸡、5头奶牛
2 楼 dwangel 2013-08-01 22:04
mysh 写道
rest 的好处在于它动态, 数据处理简单, 而不是上文说的那些不着边的什么表征

同意。
其实还是松耦合的概念。
soap等rpc其实还是不够松。
1 楼 mysh 2013-08-01 19:24
rest 的好处在于它动态, 数据处理简单, 而不是上文说的那些不着边的什么表征

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 谈linux磁盘结构及分区

    谈linux磁盘结构及分区 来源:chinaunix     日期:2006-6-20 11:32:00  点击次数:

  • linux 常用知识

    一、分区 分区原理: 1、主分区和扩展分区(逻辑分区) 2、一个硬盘最多只能分四个区 3、如果需要分5个以上分区,那么在扩展分区里面再分,理论上可以分无数个分区。   格式化原理:  1、分好区的硬盘,系统不能识别,只有格式化之后才能被操作系统识别,如果格式化为FAT32,那么就能被windows识别。  如果被格式化ext2格式,那么分区就能被linux系统认识。  2、通常硬

  • linux安装过程中的硬盘分区工具是,Linux硬盘分区管理工具

    Linux硬盘分区管理工具在安装Linux 操作系统时,如果选择了手工的分区方式,将启动硬盘分区工具Disk Druid。这个程序是安装程序自带的。下面讨论一下该软件的使用。Linux下硬盘分区的标识在Linux 下用hda、hdb 等来标识不同的硬盘;用hda1、hda2、hda5、hda6 来标识不同的分区。其中,字母a 代表第一块硬盘,b代表第二块硬盘,依次类推。而数字1 代表一块硬盘的第一...

  • linux磁盘管理工具(图形化管理工具)

    ubuntu cleaner——ubuntu应用程序及其配置文件清理。jdiskreport——目录和文件级别的使用量统计。gparted——磁盘分区信息。

  • RHCE课程-系统管理部分|6、fdisk分区及格式化

    今天我们来学习关于文件系统的操作,当然,最简单的就是分区了,而且这也是系统管理必须会的功课。 系统分区工具: disk druid:方便的分区工具,只能在安装时使用,是图形界面的 fdisk:运用广泛的自焚界面下的硬盘分区工具。 disk druid 是图形界面的,只要你有一点文件系统基础,就能够搞定,我们今天的的重点是fdisk工具。 先介绍下分区的类型,常用的有...

  • 在UNIX \ Linux终端中的可视化磁盘空间和磁盘使用情况小工具 - Vizex

    在UNIX\ Linux终端中的可视化磁盘空间和磁盘使用情况小工具 - Vizex背景-什么是VizexLinux终端上安装方法如何使用Vizex1. vezix2. vizexdf3. 可以通过 --help 使用command调用option获得全部功能。 背景-什么是Vizex Vizex是UNIX / Linux系统的终端程序,它可以帮助用户查看用户计算机上每个分区和介质的磁盘空间使用情况。并能以彩色区分度高的图形方式显示计算机上所有分区和介质的空闲和可用磁盘空间。 其包含vizexdf这一功能,允

  • CentOS 7 安装教程、硬盘分区、LVM、网络配置、软件源配置、制作

    最佳分区设置取决于 Linux 系统的用途。下面的提示可对您决定如何分配您的磁盘空间有帮助。 二.安装CentOS 7(CD、USB、网络) 1.安装引导 首先要设置计算机的启动顺序为CD-ROM或USB 启动,保存设置后将CD放入光驱或插入USB,重新启动计算机。 计算机重启后显示有几个选项的引导菜单。如果在 60 秒内没有按任何键,则运行默认引导选项。要选择默认,您可以等待计数器超

  • linux下利用图形化工具合并分区

    linux下利用图形化工具合并分区

  • Windows/Linux下磁盘使用的图形化工具简介

    Windows/Linux下磁盘使用的图形化工具简介   如何以图形界面查看磁盘及分区的大小及剩余容量呢?今天我为大家介绍两款Windows/Linux下磁盘使用的图形化工具分别是Spacesniffer/Baobab 帮你解决问题。 1.Baobab这个软件能够以图形化的形式表现磁盘所占用的空间,是GNOME环境下集成的图形化分析工具软件,对于磁盘的管理来说相当具有帮助。下载:http:/...

  • Ubuntu下的图形化分区管理工具——Gparted

    Linux下也有类似PQ Magic一样的图形化分区管理工具,他的名字叫Gparted。 在Ubuntu下: sudo apt-get install gparted 菜单上的位置是: 系统->系统管理->Gnome分区管理器 --------------------------

  • Linux下配置Druid监控,linux中druid安装与优化

    Druid 安装与优化以下是druid安装脚本,利用druid和tranquility压缩包进行安装,安装完成后,制作成系统服务。安装过程中有druid 初始化、jvm参数调整、与tranquility连接等操作。function config_druid {if [[ -e /usr/lib/systemd/system/druid.service ]];thenecho "druid alre...

  • Linux下的两种磁盘分区工具的使用

    今天我们来说一下如何使用fdisk和parted分区工具来进行硬盘分区,、下面我来说一下在Linux系统中这两种硬盘分区工具的使用方法:   ----------fdisk分区工具----------      在我的另一篇文章里已经说过了在Linux系统中硬盘分区的概念了(http://blog.chinaunix.net/u3/112561/showart_2230401.htm...

  • Linux的分区利器:GParted,小而精美

    GParted是一款免费且易于使用的基于 GTK 的图形用户界面工具,可满足您的所有分区需求,一键创建新的磁盘分区或调整现有分区的大小——Gparted 甚至可以调整分区文件的大小而不会丢失任何信息! 您还可以使用访问选项,例如移动硬盘驱动器以及检查可用空间使用情况等基本信息。 在以下教程中,带大家学习如何在 Ubuntu 22.04 LTS Jammy Jellyfish 上安装 GParted。 更新 Ubuntu 系统 在继续之前,请使用以下命令确保您的 Ubuntu 系统是最新的。 sudo apt

  • Disk Druid分区方法

    redhat9:Disk Druid分区方法:IDE接口的硬盘三个区:新建 /boot  ext3   新建 交换分区  swap  不挂载  内存1-2倍根目录 全部空间  ext3  / 。引导装载程序 grub 安装位置 默认硬盘的主引导扇区 如果主引导扇区上有其他的引导程序则 grub 要改变安装位置 点击  “改变引导装载程序” [右上角]grub 还可以用来引导其他的操作系统。“添加”

Global site tag (gtag.js) - Google Analytics