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。

最新文章

  1. html如何和CSS联系起来
  2. 读《Android编程权威指南》
  3. Android实战技巧之十二:Android Studio导入第三方类库、jar包和so库
  4. The constructor BASE64Encoder() is not accessible due to restriction on required library
  5. (原创)VM中的CentOS6.4中安装CloudStack6.3②
  6. Java基础之泛型——使用泛型链表类型(TryGenericLinkedList)
  7. js之dom_2
  8. for循环中使用了return
  9. 用户控件(.ascx)与&lt;ul&gt;&lt;li&gt;以及&lt;a&gt;布局之小结
  10. java通过freemarker导出包含富文本图片的word文档
  11. latex中长公式换行,很好的办法
  12. JAVA四类八种基本数据类型
  13. Beta(7/7)
  14. Java面试题之Java基础
  15. JAVA中使用MD5加密实现密码加密
  16. Exynos4412的外部中断是如何安排的?
  17. mysql定时执行某任务
  18. Go语言学习笔记三: 常量
  19. ASP.NET 控件不可编辑
  20. Tomcat+JDK安装和配置

热门文章

  1. jQuery Validate自定义金钱验证,是否为金额格式,保留两位小数,并支持千分制货币格式
  2. sicily 1500. Prime Gap
  3. Runtime.getRuntime().exec 类 防止阻塞
  4. 如何阻止点击scrollviewer里面的单位内容时,自动滚动
  5. 区间DP小结
  6. Springboot + Vue + shiro 实现前后端分离、权限控制
  7. C语言:输入一个多位的数字,12345,求各位相加1+2+3+4+5=15
  8. ASP.NET MVC5+ 路由特性
  9. 最小圆覆盖 gym-102006 I
  10. 因为修改linux selinux修改错误产生的问题及解决办法