RESTful的软件架构已经多火不用多说,和MVC架构一样,很多网站服务(Web Services)都遵循RESTful设计模式,那么到底什么是RESTful Web Services呢?设计一个RESTful的Web Services需要注意哪些点呢?(本文理论参考自Leonard Richardson 和 Sam Ruby的书籍《RESTful Web Services》。)

1.什么是RESTful Web Services

首先,Web Services是一个web服务,是一个web接口,其设计目的是通过web来解决如何处理资源(Resource)的问题(注:资源可以指代很多,比如一段数据,一张图片,一组用户信息),而处理资源时处理的两个核心问题是:方法信息(method information)作用域信息(scoping information),即:“我要对数据做什么?”和“我要对哪些数据做这些?”
比如用户想通过访问一个URI获取某qq号对应的昵称,那么我可以定义一个地址为“https://t.qq.com/webservice/qq/123456”的Web Services(有的人称它为web api),然后用GET方法得到一段JSON数据。
Web Services有各种设计架构,如RESTful架构、RPC架构,区别各类Web Services的方法简单的来说就是了解对于“我要对数据做什么?”和“我要对哪些数据做这些?”这两个问题的处理方式有什么不同。
关于RESTful Web Services最最重要的一个特征:REST式的Web Services架构意味着,对该Web Services进行请求时的方法信息(method information)都在报文(如图1)的请求方法(HTTP method)中,作用域信息(scoping information)都在报文的URL里,服务器在接受到HTTP请求的时候只需要关注请求报文中第一行的请求方法(HTTP method)和URL就能知道用户想做什么事了(如某报文的第一行:GET
/data/username/xxx HTTP/1.1),而报文中其余数据只是一些细节问题。


(图1 请求报文)

2.几种常见的非RESTful Web Services


1)将method information和scoping information都放在报文体中

例如:某网站所有所有接口的调用地址都为https://x.com/webservice/api,区别各接口和数据不同的方法是在报文体(entity-body)中加入不同的数据

<?xml version="1.0" ?>
<method>getUserData</method>
<params>
<param>
<key>name</key>
<value>Tom</value>
</param>
</params>
</xml>
<?xml version="1.0" ?>
<method>deleteUserData</method>
<params>
<param>
<key>name</key>
<value>Peter</value>
</param>
</params>
</xml>

2)所有接口的请求方法(HTTP method)都为“GET”,而将method information放在URL中

比如:https://x.com/webservice/api/getData/?name=tom 和 https://x.com/webservice/api/?name=peter&method=delData

3.设计RESTful Web Services一定要注意的几点

1)method information仅仅用GET,POST,HEAD,PUT,DELETE和OPTION方法就够了。

根据RFC2616标准还有TRACE和CONNECT方法,不过一般来说前面6种方法已经能满足大部分与“资源”的交互了。请不要试图发明新的方法或者将方法放在URL中,而你唯一的任务是将“资源”设计的更加合理!(感觉有点像数据库中CURD)

2)你编写的RESTful Web Services应该是无状态性的(statelessness)

无状态性是指接口本身不存在记忆功能,比如调用接口A、B、C和调用接口C、B、A产生的结果不同,这显然就是一个有状态性的。你编写的Web Services应该是相互独立的。如果你在调用B时需要依赖A提供的数据,那么在调用B时你应该将数据一并传过去。

最后再啰嗦两句:RESTful只是一种风格,并不是标准,如果你的Style更好,那就没必要为了RESTful而RESTful。

深入理解RESTful Web Services的更多相关文章

  1. RESTful Web Services初探

    RESTful Web Services初探 作者:杜刚 近几年,RESTful Web Services渐渐开始流行,大量用于解决异构系统间的通信问题.很多网站和应用提供的API,都是基于RESTf ...

  2. 【转】RESTful Web Services初探

    近几年,RESTful Web Services渐渐开始流行,大量用于解决异构系统间的通信问题.很多网站和应用提供的API,都是基于RESTful风格的Web Services,比较著名的包括Twit ...

  3. RESTful Web Services简单介绍

    近几年,RESTful Web Services渐渐开始流行,大量用于解决异构系统间的通信问题.很多网站和应用提供的API,都是基于RESTful风格的Web Services,比较著名的包括Twit ...

  4. 使用 Spring 3 来创建 RESTful Web Services

    来源于:https://www.ibm.com/developerworks/cn/web/wa-spring3webserv/ 在 Java™ 中,您可以使用以下几种方法来创建 RESTful We ...

  5. 使用 Spring 3 来创建 RESTful Web Services(转)

    使用 Spring 3 来创建 RESTful Web Services 在 Java™ 中,您可以使用以下几种方法来创建 RESTful Web Service:使用 JSR 311(311)及其参 ...

  6. 基于Spring设计并实现RESTful Web Services(转)

    基于Spring设计并实现RESTful Web Services 在本教程中,你将会使用Spring来创建一个具有生产力的RESTful网络服务. 为什么用RESTful网络服务? 从和Amazon ...

  7. Spring 3 来创建 RESTful Web Services

    Spring 3 创建 RESTful Web Services 在 Java™ 中,您可以使用以下几种方法来创建 RESTful Web Service:使用 JSR 311(311)及其参考实现 ...

  8. .NET RESTful Web Services入门

    很早之前看到过RESTful Web Services,并未在意,也没找相关资料进行学习.今天偶尔有一机会,就找了点资料进行研究,发现RESTful真是“简约而不简单”.下面用示例来说明: 1 项目结 ...

  9. Jersey the RESTful Web Services in Java

    Jersey 是一个JAX-RS的实现, JAX-RS即Java API for RESTful Web Services, 支持按照表述性状态转移(REST)架构风格创建Web服务. REST 中最 ...

随机推荐

  1. Gradle详解

    一.脚本文件(build.gradle)  项目与脚本文件 当我们执行gradle命令的时候,Gradle会在你执行命令的目录下寻找一个名为build.gradle的文件,这个文件就是Gradle的脚 ...

  2. 从一份配置清单详解 Nginx 服务器配置

      概述 在前面< Nginx 服务器开箱体验> 一文中我们从开箱到体验,感受了一下 Nginx 服务器的魅力.Nginx 是轻量级的高性能 Web 服务器,提供了诸如 HTTP 代理和反 ...

  3. python网络编程-动态导入和断言

    一:动态导入importlib 在程序运行的过程中,根据变量或者配置动态的决定导入哪个模块,可以使用模块importlib importlib使用示例 二:断言assert 如果接下来的程序依赖于前面 ...

  4. 安装window系统

    安装服务器系统,进入windowpe后将iso中sources,bootmgr,和boot拷贝到C盘,执行bootsect.exe  /nt60  c:,调试froad13的consle win8 改 ...

  5. 微信 JS API 支付教程

    最近一个项目中用到了微信开发,之前没有做过支付相关的东西,算是拿这个来练练手,刚开始接触支付时候很懵逼,加上微信支付开发文档本来就讲得不清楚,我是彻底蒙圈了,参考了很多代码之后,算是有一点思路了. 用 ...

  6. java 多线程总结篇1之——基本概念

    1.什么是线程 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.(进程是资源分配的最小单位) 线程:同一类线程共享代码和数据空间,每个线程 ...

  7. LeetCode403. Frog Jump

    A frog is crossing a river. The river is divided into x units and at each unit there may or may not ...

  8. 不用的代码,存一份--用tornado实现的websocket

    因为现在使用Channels来实现啦, 这样就在Django的体系里自已弄完了. 方便后期代码维护和服务器部署. 这份土陋的东东,就放起来吧. 毕竟,通过读取文件来返回实时websocket,不适应于 ...

  9. Asp.net Vnext TagHelpers

    概述 本文已经同步到<Asp.net Vnext 系列教程 >中] TagHelpers 是vnext中引入的新功能之一.TagHelper 的作用是类似于发挥在以前版本的 ASP.NET ...

  10. chrome浏览器视频插件

    以前安装chrome浏览器flash插件是将libflashplayer.so拷贝到chrome浏览器的plugins目录下.但最近好像不行了. 于是换了另一插件:pepperflashplugin- ...