读书笔记,原文链接:http://www.cnblogs.com/loveis715/p/4669091.html,感谢作者!

1、REST是一种架构风格,其核心是面向资源,简化设计,降低开发的复杂性,提高系统的可伸缩性。

REST设计概念和准则为:

a、网络上的所有事物都可以被抽象为资源,通过统一资源标识符(URI)来识别和定位资源。每个资源都有唯一的资源标识,对资源的操作不会改变这些标识

b、REST设计架构遵循CRUD原则,针对这些资源执行的操作使用请求方法,如:
           ◆POST: 创建

◆GET: 读取

◆PUT: 更新

◆DELETE: 删除

c、所有的操作都是无状态的,没有上下文的约束。

    这样如果做分布式、集群就不需要考虑上下文和会话保持的问题,可以极大的提高系统的可伸缩性。

2、一个实际的REST例子:

REST架构下,一个 Web 应用总是使用固定的 URI 表示一个资源,

我们来看一个实际例子:

http://www.example.com/photo/logo

指向 example.com 网站(Web应用)中类型为 photo,名字为 logo 的资源。

我们用浏览器访问这个URI,看到的将可能是一个 xhtml 文档,或一个xml,或者一个图片。

     事实上,这个地址很可能会在服务器内部处理为 http://www.example.com/photo.do?name=logo 这样的地址。

     photo.do 是服务器端的一个action,根据 name 参数生成 xhtml 文档返回给浏览器。

     现在假设我们要获取这张照片的 XML 文档。XML 文档中包含照片的文件名、文件大小、拍摄日期等等信息。

     也就是说我们要获取“同一个资源的不同表现形式的数据”。

     错误的实现方式:

        对于这个要求,我们可以很容易的用另一个 URL 地址达到:http://www.example.com/xml/logo。

        但是,这就违背了“URI 唯一标识一个资源”的定义。如果我们要获取同一个资源的多种表现形式,那么就要使用更多的 URL,从而给一个资源指定了多个不同的 URI。

        而在 REST 中,不管是获取照片的 xhtml 文档还是 XML 文档,或者照片文件本身,都是用同一个 URI,就是 http://www.example.com/photo/logo。

     正确的实现方式:

那这是怎么办到的呢?

我们可以通过HTTP Request Header 信息来区分客户端是想要取得资源的哪一种表现形式的数据。

        当我们用浏览器访问一个网址时,浏览器会构造一个 HTTP 请求。这个请求有一个头信息,其中包括了本次请求接受何种类型的数据。

        通常浏览器发送的 HTTP 请求头中,Accept 的值都是 */*,也就说接受服务器返回的任何类型的数据。

        所以,只要我们指定一个特定的 Accept 参数,服务器就可以通过判断该参数来决定返回什么类型的数据。

        所以在一个采用 REST 架构的应用中,要获取同一个资源的不同表现形式的数据,只需要使用不同的 HTTP 请求头信息就行了。   

        再如:

一段文字,可以用txt去表现,也可以用 html、xml、json表示。

一张图片,有jpg、png、gif格式。

我们把一种资源具体呈现出来的形式叫表现层。

3、一个应用场景:

如果考虑为一个 Web 应用增加 Web Services,这种技术的价值就体现出来了。

比如我写了一个 Delphi 程序,现在只需要构造一个包含 Accept: text/xml 的 HTTP 请求头,然后将请求发送到 http://www.example.com/photo/logo 就可以了。

返回的结果就是一个 XML 文档,而不是 xhtml 文档。

4、更完整的REST架构例子

REST 架构用不同的 HTTP 请求方法来处理对资源的 CRUD(创建、读取、更新和删除)操作。 对一个资源的 CRUD 操作就可以通过同一个 URI 完成,如:
     http://www.example.com/photo/logo(读取) 仍然保持为 [GET] http://www.example.com/photo/logo

http://www.example.com/photo/logo/create(创建) 改为 [POST] http://www.example.com/photo/logo

http://www.example.com/photo/logo/update(更新) 改为 [PUT] http://www.example.com/photo/logo

http://www.example.com/photo/logo/delete(删除) 改为 [DELETE] http://www.example.com/photo/logo

通过 REST 架构,Web 应用程序可以用一致的接口(URI)暴露资源给外部世界,并提供对资源的操作服务。

     这对于以资源为中心的 Web 应用来说非常重要。例如照片共享网站、用户社区等。

restful架构风格设计准则(二)以资源为中心,一个url的更多相关文章

  1. restful架构风格设计准则(四)资源表示和资源访问

    读书笔记,原文链接:http://www.cnblogs.com/loveis715/p/4669091.html,感谢作者! 一.资源表示 1.资源表示:使用 单数 vs. 复数 如果一个URL所对 ...

  2. restful架构风格设计准则(三)资源识别和资源设计

    读书笔记,原文链接:http://www.cnblogs.com/loveis715/p/4669091.html,感谢作者! restful风格的设计中,首先要识别系统中的资源,然后用HTTP规范表 ...

  3. restful架构风格设计准则(一)以资源为中心、自描述的请求响应、资源状态迁移为粒度

    读书笔记,原文链接:http://www.cnblogs.com/loveis715/p/4669091.html,感谢作者! 一.需求描述 当用户在某个电子商务网站购物时,他首先查看要购买的商品分类 ...

  4. restful架构风格设计准则(六)版本管理

    读书笔记,原文链接:http://www.cnblogs.com/loveis715/p/4669091.html,感谢作者! 版本管理 在前面已经提到过,一个REST系统为资源所抽象出的URI实际上 ...

  5. restful架构风格设计准则(五)用户认证和session管理

    读书笔记,原文链接:http://www.cnblogs.com/loveis715/p/4669091.html,感谢作者! Authentication REST提倡无状态约束,这就要求:用户状态 ...

  6. RESTful架构(Representational State Transfer资源表现层状态转换)

    1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Roy Fielding的 ...

  7. 理解RESTful架构

    越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency).高 ...

  8. [转]理解RESTful架构

    原文地址:http://www.ruanyifeng.com/blog/2011/09/restful 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件" ...

  9. 理解RESTful架构(转载)

    本文转载自:http://www.ruanyifeng.com/blog/2011/09/restful.html 越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软 ...

随机推荐

  1. 兄弟连PHP培训教你提升效率的20个要点

    兄弟连PHP培训教你提升效率的20个要点 用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则 不会,注意:只有echo能这么做,它是一种可以把多个字 ...

  2. 新装的Linux服务系统安装MySQL

    目的描述:全新的腾讯云Linux服务器,系统是ubuntu 16.04.需要在上面安装mysql数据库. 使用XShell远程登录,在终端窗口中使用sudo apt-get 指令在线安装mysql. ...

  3. ASP.NET MVC上传图片的奇怪问题

    本文来源于博客园-钱智慧,转载请注明出处 表现:客户说就华为的手机有问题,而且是在QQ里打开有问题,如果在手机的浏览器上,则可以正常上传图片. 有问题的代码如下: private ResultMode ...

  4. 51ak带你看MYSQL5.7源码3:修改代码实现你的第一个Mysql版本

    从事DBA工作多年 MYSQL源码也是头一次接触 尝试记录下自己看MYSQL5.7源码的历程 目录: 51ak带你看MYSQL5.7源码1:main入口函数 51ak带你看MYSQL5.7源码2:编译 ...

  5. Python 中的登陆获取数据跳转页面(不含数据库)

    简单表单和模板: import os.path import tornado.httpserver import tornado.ioloop import tornado.options impor ...

  6. 笔记:XML-解析文档-流机制解析器(SAX、StAX)

    DOM 解析器完整的读入XML文档,然后将其转换成一个树型的数据结构,对于大多数应用,DOM 都运行很好,但是,如果文档很大,并且处理算法又非常简单,可以在运行时解析节点,而不必看到完整的树形结构,那 ...

  7. window.print()打印页面指定内容(使用iframe保证原页面不失效)

    使用window.print()时会出现两个问题: (1)直接使用window.print() 打印的是整页内容-->无法实现打印指定区域 (2)打印时替换body中的内容,打印完成后再替换回来 ...

  8. 微信APP长按图片禁止保存到本地

    项目遇到一个问题,在web页面中,禁止长按图片保存, 使用css属性:  img { pointer-events: none; } 或者  img { -webkit-user-select: no ...

  9. SQL注入之Sqli-labs系列第一篇

    在开始接触渗透测试开始,最初玩的最多的就是Sql注入,注入神器阿D.明小子.穿山甲等一切工具风靡至今.当初都是以日站为乐趣,从安全法实施后在没有任何授权的情况下,要想练手只能本地环境进行练手,对于sq ...

  10. kvm之四:从网上镜像安装虚拟机Centos6.8

    1.再加块硬盘,格式化挂载至新建目录/kvm2下 2.CentOS 6.8镜像地址 http://mirrors.163.com/centos/6.8/os/x86_64/ 3.配置安装参数,执行安装 ...