中文翻译为"具象状态传输"的RESTful的架构风格和设计思想

本文标签:  具象状态传输 RESTful架构 RESTful理解 REST   服务器

REST 定义了一组体系架构原则,您可以根据这些,包括使用不同语言编写的客户端如何通过 HTTP 处理和传输资源状态。所以在事实上,REST 对 Web的影响非常大,由于其使用相当方便,已经普遍地取代了基于 SOAP 和 WSDL 的接口设计。在多年以后的今天,REST的主要框架已经开始雨后春笋般的出现。

REST(Representational State Transfer ),有中文翻译为"具象状态传输"(也有:"代表性状态传输")。是由 Roy Thomas Fielding博士 在2000年就读加州大学欧文分校期间在学术论文中提出的一个术语。他首次系统全面地阐述了REST的架构风格和设计思想。这篇论文是Web发展史上一篇非常重要的技术文献,他也为WEB架构的设计与评判奠定了理论基础。

中文版论文下载地址:http://ishare.iask.sina.com.cn/f/20790836.html

个人理解:

(一)  首先REST只是一种风格,不是一种标准

(二)  REST是以资源为中心的

(三)  REST充分利用或者说极端依赖HTTP协议

一.对于今天正在吸引如此多注意力的最纯粹形式的 REST Web 服务,其具体实现应该遵循以下基本设计原则:

1.1.显式地使用不同的 HTTP 请求方法

1.2.无状态

1.3.公开目录结构式的 URI(通过逻辑URI定位资源)。

1.1.显式地使用不同的 HTTP 请求方法

 

我们在 Web 应用中处理来自客户端的请求时,通常只考虑 GET 和 POST 这两种 HTTP 请求方法。实际上,HTTP 还有 HEAD、PUT、DELETE 等请求方法。而在 REST 架构中,用不同的 HTTP 请求方法来处理对资源的 CRUD(创建、读取、更新和删除)操作:

若要在服务器上创建资源,应该使用 POST 方法。

若要检索某个资源,应该使用 GET 方法。

若要更改资源状态或对其进行更新,应该使用 PUT 方法。

若要删除某个资源,应该使用 DELETE 方法。

经过这样的一番扩展,我们对一个资源的 CRUD 操作就可以通过同一个 URI 完成了:

读取) [GET] 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 应用来说非常重要。

1.2.无状态

在 REST 的定义中,一个 Web 应用总是使用固定的 URI 向外部世界呈现一个资源。

它认为Web是由一系列的抽象资源组成,这些抽象的资源具有不同的具体表现形式。

譬如,定义一个资源为photo,含义是照片,它的表现形式可以是一个图片,也可以是一个.xml的文件,其中包含一些描述该照片的元素,或是一个html文件。 并且这些具体的表现可以分布在不同的物理位置上。

1.3.通过逻辑URI定位资源

实现这种级别的可用性的方法之一是定义目录结构式的 URI。

此类 URI 具有层次结构,其根为单个路径,从根开始分支的是公开服务的主要方面的子路径。 根据此定义,URI 并不只是斜杠分隔的字符串,而是具有在节点上连接在一起的下级和上级分支的树。

例如,在一个收集photo的相册中,您可能定义类似如下的结构化 URI 集合:

http://www.example.com/photo/topics/{topic}

如:http://www.example.com/photo/topics/home

根 / photo之下有一个 /topics 节点。 该节点之下有一系列主题名称,例如生日照片,聚会照片等等,每个主题名称指向某个讨论线。 在此结构中,只需在 {topic}输入某个内容即可容易地收集讨论线程。

在某些情况下,指向资源的路径尤其适合于目录式结构。 例如,以按日期进行组织的资源为例,这种资源非常适合于使用层次结构语法。

此示例非常直观,因为它基于规则:

http://www.example.com/photo/2010/02/22/{topic}

第一个路径片段是四个数字的年份,第二个路径片断是两个数字的月份,第三个片段是两个数字的日期。这就是我们追求的简单级别。 在语法的空隙中填入路径部分就大功告成了,因为存在用于组合 URI 的明确模式:

http://www.example.com/photo/{year}/{day}/{month}/{topic}

从而不需要我们去这样去传递信息:http://www.example.com/photo?year=xxxx&day=xxx$month=xxx&topic=xxxx

二.Restful web service的优点:

2.1 HTTP头中可见的统一接口和资源地址

通过对于HTTP Head 的解析,我们便可以了解到当前所请求的资源和请求的方式。这样做对于一些代理服务器的设置,将带来很高的处理效率。

REST 系统中所有的动作和要访问的资源都可以从HTTP和URI中得到,这使得代理服务器、缓存服务器和网关很好地协调工作。而RPC模型的SOAP 要访问的资源仅从 URI无法得知,要调用的方法也无法从HTTP中得知,它们都隐藏在 SOAP 消息中。

同样的,在REST系统中的代理服务器还可以通过 HTTP 的动作 (GET 、 POST)来进行控制。

2.2 返回一般的XML格式内容

一般情况下,一个RESTful Web Service将比一个传统SOAP RPC Web Service占用更少的传输带宽。

2.3 安全机制

REST使用了简单有效的安全模型。REST中很容易隐藏某个资源,只需不发布它的URI;而在资源上也很容易使用一些安全策略,比如可以在每个 URI 针对 4个通用接口设置权限;再者,以资源为中心的 Web服务是防火墙友好的,因为 GET的 意思就是GET, PUT 的意思就是PUT,管理员可以通过堵塞非GET请求把资源设置为只读的,而现在的基于RPC 模型的 SOAP 一律工作在 HTTP 的 POST上。而使用 SOAP RPC模型,要访问的对象名称藏在方法的参数中,因此需要创建新的安全模型。

三. 使用REST架构

  对于开发人员来说,关心的是如何使用REST架构,这里我们来简单谈谈这个问题。REST带来的不仅仅是一种崭新的架构,它更是带来一种全新的Web开发过程中的思维方式:通过URL来设计系统结构。REST是一套简单的设计原则、一种架构风格(或模式),不是一种具体的标准或架构。到今天REST有很多成功的使用案例,客户端调用也极其方便。

下面是我通过Spring3.0来举个例子:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30


@Controller

public class ArticleController { 

  

    @RequestMapping(value = "/article/{category}/{id}", method = RequestMethod.GET) 

    public ModelAndView loadArticle(@PathVariable String category, @PathVariable int id, 

            @RequestParam(value = "mode", required = false) String mode) { 

          // ...

    

  

    @RequestMapping(value = "/article", method = RequestMethod.GET) 

    public ModelAndView loadArticleCategories() { 

        // ...

    

  

    @RequestMapping(value = "/article", method = RequestMethod.DELETE) 

    public ModelAndView delArticleCategories() { 

         // ...

    

  

    @RequestMapping(value = "/addarticle", method = RequestMethod.POST) 

    public ModelAndView addArticleCategories(Category category) { 

        // ...

    

  

    @RequestMapping(value = "/addarticle/{name}", method = RequestMethod.POST) 

    public ModelAndView addArticleCategoriesForName(@PathVariable String name) { 

         // ...

    

  

  

然后使用Spring提供的RestTemplate来调用这些服务


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31


@Component("articleClient"

public class ArticleClient { 

  

    @Autowired

    protected RestTemplate restTemplate; 

  

    private final static String articleServiceUrl = "http://localhost:8082/articleservice/"

  

    @SuppressWarnings("unchecked"

    public List<Category> getCategories() { 

        return restTemplate.getForObject(articleServiceUrl + "article", List.class); 

    

  

    public Article getArticle(String category, int id) { 

        return restTemplate.getForObject(articleServiceUrl + "article/{category}/{id}", Article.class, category, id); 

    

  

    @SuppressWarnings("unchecked"

    public void delCategories() { 

        restTemplate.delete(articleServiceUrl + "article"); 

    

  

    @SuppressWarnings("unchecked"

    public List<Category> postCategories() { 

        Map<String, String> params = new HashMap<String, String>(); 

        params.put("name", "jizhong"); 

        return restTemplate.postForObject(articleServiceUrl + "addarticle/{name}", null, List.class, params); 

  

    

  

  

提示一下:使用RestTemplate来验证Controller层是一个很不错的选择。

需要注意的是:

RestTemplate 默认并不支持对 DELETE 方法使用请求体。

因为RestTemplate 默认是使用 spring 自身的 SimpleClientHttpRequestFactory 创建请求对象和对其进行相关设置(如请求头、请求体等),它只支持 PUT 和 POST 方法带请求体,RestTemplate 的 DELETE 方法不支持传入请求体是因为 JDK 中 HttpURLConnection 对象的 delete 方法不支持传入请求体(如果对 HttpURLConnection 对象的 delete 方法传入请求体,在运行时会抛出 IOException)。

我们可以通过修改 RestTemplate 的 RequestFactory 实现 delete 方法对请求体的支持。

写在最后:FOR Freedom 看看外边的世界,以及IT这一行,少不了去Google查资料,最后,安利一个V——PN代理。一枝红杏 加速器,去Google查资料是绝对首选,连接速度快,使用也方便。我买的是99¥一年的,通过这个链接(http://my.yizhihongxing.com/aff.php?aff=2509)注册后输上会员中心得优惠码,平摊下来,每月才7块钱,特实惠。

本文标签:  具象状态传输 RESTful架构 RESTful理解 REST   服务器

转自 SUN‘S BLOG - 专注互联网知识,分享互联网精神!

原文地址: 中文翻译为"具象状态传输"的RESTful的架构风格和设计思想

相关阅读:我是 G 粉,一直关注 Google,最近 Google 有一些小动作,可能很多人不太了解

相关阅读:机器学习引领认知领域的技术创新,那么SaaS行业会被机器学习如何改变?

相关阅读:VPS 教程系列:Dnsmasq + DNSCrypt + SNI Proxy 顺畅访问 Google 配置教程

相关阅读: 对程序员有用:2017最新能上Google的hosts文件下载及总结网友遇到的各种hosts问题解决方法及配置详解

相关阅读:Aaron Swartz – 互联网天才开挂的人生历程:每时每刻都问自己,现在这世界有什么最重要的事是我能参与去做的?
相关阅读:网站环境apache + php + mysql 的XAMPP,如何实现一个服务器上配置多个网站?

相关阅读:什么是工程师文化?各位工程师是为什么活的?作为一个IT或互联网公司为什么要工程师文

相关阅读:win10永久激活教程以及如何查看windows系统是不是永久激活?

相关BLOG:SUN’S BLOG - 专注互联网知识,分享互联网精神!去看看:www.whosmall.com

原文地址:http://whosmall.com/?post=243

时间: 2024-11-03 21:15:38

中文翻译为"具象状态传输"的RESTful的架构风格和设计思想的相关文章

RESTful 服务架构风格 * .NET的RESTful框架 OpenRasta

REST 的约束采用的就是掌控 Web 的基本原则.这些原则是: 用户代理与资源交互,任何可命名和表达的事物都可称为资源.每项资源都有一个唯一的统一资源标识符 (URI). 与资源的交互(通过其唯一的 URI 定位)使用 HTTP 标准动词(GET.POST.PUT 和 DELETE)的统一接口完成.交互中声明资源的媒体类型也很重要,它使用 HTTP 内容类型标头指定.(XHTML.XML.JPG.PNG 和 JSON 就是一些广为人知的媒体类型.) 资源是自我描述的.处理资源请求所需的全部信息

SpringBoot RESTful API 架构风格实践

如果你要问 Spring Boot 做什么最厉害,我想答案就在本章标题 RESTful API 简称 REST API . 1 RESTful API 概述 1.1 什么是 RESTful API Rest 是一种规范,符合 Rest 的 Api 就是 Rest Api.简单的说就是可联网设备利用 HTTP 协议通过 GET.POST.DELETE.PUT.PATCH 来操作具有URI标识的服务器资源,返回统一格式的资源信息,包括 JSON.XML.CSV.ProtoBuf.其他格式. 1.2

【转】关于HTTP中文翻译的讨论

http://www.ituring.com.cn/article/1817 讨论参与者共16位: 图灵谢工 杨博 陈睿杰 贾洪峰 李锟 丁雪丰 郭义 梁涛 吴玺喆 邓聪 胡金埔 臧秀涛 张伸 图钉派_007_LL 图钉派_111_DP 图钉派-34徐浩然 辩论主题:HTTP中的“transfer”是否应该翻译为“传输”? 主持人:图灵谢工 正方:贾洪峰.郭义.梁涛 正方观点:为了照顾读者的阅读习惯,还是应该继续沿用“超文本传输协议”这个称呼. 反方:陈睿杰.李锟.丁雪峰 反方观点:HTTP既然

(转载)saltstack master配置文件中文翻译

原文出处:http://blog.coocla.org/301.html Salt系统的配置是令人惊讶的简单,对于salt的两个系统都有各自的配置文件,salt-master是通过一个名为master的文件配置,salt-minion是通过一个名为minion的文件配置. salt-master的配置文件位于/etc/salt/master,可用选项如下(不全): 1.主配置####################### interface默认值:0.0.0.0(所有的网络地址接口)绑定到本地的

[译] QUIC Wire Layout Specification - Frame Types and Formats | QUIC协议标准中文翻译(4) 帧类型和格式

欢迎访问我的个人网站获取更好的阅读排版体验: [译] QUIC Wire Layout Specification - Frame Types and Formats | QUIC协议标准中文翻译(4) 帧类型和格式 | yoko blog (https://pengrl.com/p/47156/) 目录 Frame Types | 帧类型 STREAM Frame | 流类型帧 ACK Frame | ACK帧 STOP_WAITING Frame | 停止等待帧 WINDOW_UPDATE

苹果App Store审核指南中文翻译(2014.9.1更新)

转:http://www.cocoachina.com/appstore/20140901/9500.html CocoaChina对<苹果应用商店审核指南>中文翻译最近一次更新时间为2014-02-27,文中红色部分是相对于2014-02-27版本的新增内容,蓝色表示苹果相关官方文档的链接 App Store Review Guidelines(英文版) 前言 感谢您付出宝贵的才华与时间来开发iOS应用程程序.从职业与报酬的角度而言,这对于成千上万的开发员来说一直都是一项值得投入的事业,我们

Spring Framework Reference Documentation 3.2.8.RELEASE 第23章中文翻译

23. JMS (Java Message Service) [中文翻译 by [email protected]] 23.1 介绍 Spring提供了一个JSM集成框架,简化了JMS API的使用.这点很像Spring对JDBC的集成. JMS大致提供生产消息和消费消息两类功能.JmsTemplate类用来生产消息和同步接收消息[译注:接收消息也就是消费消息].为了异步接收消息(异步接收消息类似于JavaEE的消息驱动Bean(Message-Driven Bean,MDB),Spring提供

《Introduction to Tornado》中文翻译计划——第五章:异步Web服务

http://www.pythoner.com/294.html 本文为<Introduction to Tornado>中文翻译,将在https://github.com/alioth310/itt2zh上面持续更新,本文内容可能不是最新状态,请在GitHub上获得最新版本. 本文也可在http://demo.pythoner.com/itt2zh上进行格式化的预览. 第五章:异步Web服务 到目前为止,我们已经看到了许多使Tornado成为一个Web应用强有力框架的功能.它的简单性.易用性

[转]苹果App Store审核指南中文翻译

原文地址:http://www.cocoachina.com/newbie/basic/2014/0227/7892.html 前言 感谢您付出宝贵的才华与时间来开发iOS应用程程序.从职业与报酬的角度而言,这对于成千上万的开发员来说一直都是一项值得投入的事业,我们希望帮助您加入这个成功的组织.我们发布了<App Store审核指南>(App Store Review Guidelines),希望通过它帮您避开开发应用程序过程中的一些问题,并帮你在提交应用时加快审核流程. 我们将应用程序(A