`

restful

 
阅读更多

RESTful的理解

 
REST(Representational State Transfer ),有中文翻译为"具象状态传输"(也有:"代表性状态传输")。是由 Roy Thomas Fielding博士 在2000年就读加州大学欧文分校期间在学术论文中提出的一个术语。他首次系统全面地阐述了REST的架构风格和设计思想。这篇论文是Web发展史上一篇非常重要的技术文献,他也为WEB架构的设计与评判奠定了理论基础。
 
中文版论文下载地址:http://ishare.iask.sina.com.cn/f/20790836.html
 
REST 定义了一组体系架构原则,您可以根据这些,包括使用不同语言编写的客户端如何通过 HTTP 处理和传输资源状态。所以在事实上,REST 对 Web的影响非常大,由于其使用相当方便,已经普遍地取代了基于 SOAP 和 WSDL 的接口设计。在多年以后的今天,REST的主要框架已经开始雨后春笋般的出现。
 
 个人理解:
(一)  首先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 方法对请求体的支持。具体实现可以参考:http://blog.csdn.net/hemingwang0902/article/details/9152431
 
参考资料:
1.     利用 Spring MVC 和 RestTemplate 实现 CorsProxy
分享到:
评论

相关推荐

    二级理论题(选择83+判断96).xlsx

    二级理论题(选择83+判断96).xlsx

    2024年中国超声非侵入式腐蚀检测传感器行业研究报告.docx

    2024年中国超声非侵入式腐蚀检测传感器行业研究报告

    设备OEE实践与教学知识

    设备自动化综合利用率实践,详细描述了OEE各方面的参数与应用,让设备自动化工厂利用此工具可以快速提高生产

    tensorflow-gpu-2.2.3-cp37-cp37m-win-amd64.whl

    python

    server-jre-8u411-windows-x64.tar.gz

    server-jre-8u411-windows-x64.tar.gz

    node-v7.8.0-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于51单片机秒表的程序设计.RAR

    单片机学习代码资料

    升压斩波电路Multisim源文件-输入电压DC15V,输出电压调节范围:+18V~+30V,电流:500mA~100mA范围

    输入电压DC15V,输出电压调节范围:+18V~+30V,电流:500mA~100mA范围,纹波1%

    nacos-server-2.3.2

    nacos-server-2.3.2

    聚类微博数据可视化分析系统 技术框架python + django + mysql + nlp + 聚类 +pycharm

    聚类微博数据可视化分析系统 技术框架 python + django + mysql + nlp + 聚类 +pycharm 角色介绍 普通用户 qqq 123456 模块分析 登录注册 数据获取 数据处理 数据挖掘 NLP情感分析 K-means聚类分析 敏感词预警 (支持邮箱发送模式) 不同聚类 (三个不同的聚类计算结果对比,选择最优的聚类来显示) 数据可视化模块 大事件数据可视化 热点数据排行 热门主题词云 评论数据可视化 时间顺序可视化 退出模块 数据库weibo_nlp_system 分析原理 我的最爱是动漫,你喜欢什么呢? 我 的 最爱 是 动漫 你 喜欢 什么 呢

    选择判断题库.doc

    选择判断题库.doc

    青藏高原城市化和生态环境迫切化大屏数据可视化系统

    【作品名称】:青藏高原城市化和生态环境迫切化大屏数据可视化系统 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。

    TCABEE 008-2020 轨道交通车站高效空调系统技术标准.pdf

    TCABEE 008-2020 轨道交通车站高效空调系统技术标准.pdf

    MySQL笔记思维导图

    MySQL笔记思维导图

    Windows 10 Docker 安装教程

    附件是Windows 10 Docker 安装教程, 文件绿色安全,请大家放心下载,仅供交流学习使用,无任何商业目的!

    node-v4.4.1-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    东北大学信息学院控制与科学博士课程《matlab语言与应用》薛定宇课程作业 chapter1-chapter14 自己做的

    东北大学信息学院控制与科学博士课程《matlab语言与应用》薛定宇课程作业 chapter1-chapter14 自己做的

    azure-ai-services-speech-service(微软语音服务文档)

    azure-ai-services-speech-service(微软语音服务文档)

    数据库课程设计涵盖了从需求分析、概念设计、逻辑设计到物理设计的整个数据库设计流程 为了帮助学生更好地理解和掌握这些内容,课程设计

    数据库课程设计涵盖了从需求分析、概念设计、逻辑设计到物理设计的整个数据库设计流程。为了帮助学生更好地理解和掌握这些内容,课程设计提供了丰富的学习资源。 首先,课程提供了详细的教学课件和PPT,这些资源系统地介绍了数据库设计的基本概念和步骤,帮助学生建立起对数据库设计的整体认识。 其次,课程设计还提供了大量的实践案例和练习题。学生可以通过分析实际案例,了解数据库设计在实际应用中的具体实现方法。同时,练习题可以帮助学生巩固所学知识,提高实际操作能力。 此外,课程设计还鼓励学生利用网络资源进行学习。学生可以通过在线教程、视频系列以及经典的数据库设计书籍等拓展学习视野,深入了解数据库设计的最新技术和方法。 最后,课程设计还强调团队协作和沟通能力的培养。学生需要分组完成设计任务,通过团队合作解决问题,提高协作和沟通能力。 总之,数据库课程设计提供了丰富的学习资源和实践机会,帮助学生全面掌握数据库设计的基本知识和技能。通过这门课程的学习,学生将能够为后续的数据库应用开发和数据管理工作打下坚实的基础。

    17.rar

    17.rar

Global site tag (gtag.js) - Google Analytics