青青子衿, 悠悠我心, 但为君故, 沉吟至今
« Google Reader支持评论功能微软Windows Live照片库升级 »

基于REST架构的Web Service设计

  先前我曾经介绍过利用Apache Axis实现基于SOAP的Web Service实现技术和相关代码,总的来说,SOAP的Web Service解决方案虽然较为成熟,且安全性较好,但是使用门槛较高,在大并发情况下会有性能问题,在互联网上使用不太普及,因此并不太适合Web 2.0网站服务使用,目前大量的Web 2.0网站使用另外一种解决方案——REST。

  REST的架构设计

  REST(Representational State Transfer)是一种轻量级的Web Service架构风格,其实现和操作明显比SOAP和XML-RPC更为简洁,可以完全通过HTTP协议实现,还可以利用缓存Cache来提高响应速度,性能、效率和易用性上都优于SOAP协议。

  REST架构遵循了CRUD原则,CRUD原则对于资源只需要四种行为:Create(创建)、Read(读取)、Update(更新)和Delete(删除)就可以完成对其操作和处理。这四个操作是一种原子操作,即一种无法再分的操作,通过它们可以构造复杂的操作过程,正如数学上四则运算是数字的最基本的运算一样。

  REST架构让人们真正理解我们的网络协议HTTP本来面貌,对资源的操作包括获取、创建、修改和删除资源的操作正好对应HTTP协议提供的GET、POST、PUT和DELETE方法,因此REST把HTTP对一个URL资源的操作限制在GET、POST、PUT和DELETE这四个之内。这种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。

  REST的设计准则

  REST架构是针对Web应用而设计的,其目的是为了降低开发的复杂性,提高系统的可伸缩性。REST提出了如下设计准则:

  网络上的所有事物都被抽象为资源(resource);

  每个资源对应一个唯一的资源标识符(resource identifier);

  通过通用的连接器接口(generic connector interface)对资源进行操作;

  对资源的各种操作不会改变资源标识符;

  所有的操作都是无状态的(stateless)。

  使用REST架构

  对于开发人员来说,关心的是如何使用REST架构,这里我们来简单谈谈这个问题。REST不仅仅是一种崭新的架构,它带来的更是一种全新的Web开发过程中的思维方式:通过URL来设计系统结构。REST是一套简单的设计原则、一种架构风格(或模式),不是一种具体的标准或架构。REST有很多成功的使用案例,著名的Delicious和Flickr都提供基于REST风格的API使用,客户端调用也极其方便,下面是我用ASP写的一个很简单的REST举例,从中可以看出REST是多么的简单易用。

  客户端代码:

Private Function httpGet(url, method, data)
    Dim xmlhttp
    Set xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
    xmlhttp.open method, url + "?" + data, False
    xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
    xmlhttp.setRequestHeader "Content-Length", Len(data)
    xmlhttp.send (Null)
    If (xmlhttp.Status = 200) Then httpGet = xmlhttp.responseText
    Set xmlhttp = Nothing
End Function

Private Function httpPost(url, method, data)
    Dim xmlhttp
    Set xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
    xmlhttp.open method, url, False
    xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
    xmlhttp.setRequestHeader "Content-Length", Len(data)
    xmlhttp.send (data)
    If (xmlhttp.Status = 200) Then httpPost = xmlhttp.responseText
    Set xmlhttp = Nothing
End Function

Private Function httpPut(url, method, data)
    Dim xmlhttp
    Set xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
    xmlhttp.open method, url, False
    xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
    xmlhttp.setRequestHeader "Content-Length", Len(data)
    xmlhttp.send (data)
    If xmlhttp.Status >= 400 And xmlhttp.Status <= 599 Then
        response.write " Error Occurred : " & xmlhttp.Status & " - " & xmlhttp.statusText
    Else
        response.write xmlhttp.responseText
    End If
    If (xmlhttp.Status = 200) Then httpPut = xmlhttp.responseText
    Set xmlhttp = Nothing
End Function

Private Function httpDelete(url, method, data)
    Dim xmlhttp
    Set xmlhttp = Server.CreateObject("MSXML2.ServerXMLHTTP")
    xmlhttp.open method, url + "?" + data, False
    xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"
    xmlhttp.setRequestHeader "Content-Length", Len(data)
    xmlhttp.send (Null)
    If xmlhttp.Status >= 400 And xmlhttp.Status <= 599 Then
        response.write " Error Occurred : " & xmlhttp.Status & " - " & xmlhttp.statusText
    Else
        response.write xmlhttp.responseText
    End If
    If (xmlhttp.Status = 200) Then httpDelete = xmlhttp.responseText
    Set xmlhttp = Nothing
End Function

response.write httpPost("http://localhost/rest/service.asp", "POST", "do=POST")
response.write httpGet("http://localhost/rest/service.asp", "GET", "do=GET")
response.write httpPut("http://localhost/rest/service.asp", "PUT", "do=PUT")
response.write httpDelete("http://localhost/rest/service.asp", "DELETE", "do=DELETE")

  服务端代码:

Response.Write Request.ServerVariables("REQUEST_METHOD")
If (Request.ServerVariables("REQUEST_METHOD")="GET") Then
 Response.Write "DO GET" + Request("do")
ElseIf (Request.ServerVariables("REQUEST_METHOD")="POST") Then
 Response.Write "DO POST" + Request("do")
ElseIf (Request.ServerVariables("REQUEST_METHOD")="PUT") Then
 Response.Write "DO PUT" + Request("do")
ElseIf (Request.ServerVariables("REQUEST_METHOD")="DELETE") Then
 Response.Write "DO DELETE" + Request("do")
End if

  需要注意的是,IIS服务器默认是不支持ASP文件的PUT和DELETE操作,默认会返回“403 - Forbidden”错误,因此需要修改IIS的设置,修改方法是:管理根据-IIS信息服务器-网站-属性-主目录-应用程序配置-配置-映射,选择ASP - 编辑 - 修改为全部动作。

  关于更多关于REST方面的知识,建议阅读《RESTful Web Services》这本书。



  除非注明,月光博客文章均为原创,转载请以链接形式标明本文地址

  本文地址:http://www.williamlong.info/archives/1728.html
  • 文章排行:
  • 3.Rei
  • Ruby on Rails框架在REST走得很前,开发时默认都按照RESTful风格搭建。

    《RESTful Web Services》是本好书
  • 2009/3/13 14:04:21   支持(12)反对(6) 回复
  • 4.ddd
  • appspot.com也被XXX了,所有基于它的网站全部X掉了。
  • 2009/3/14 14:07:38   支持(9)反对(4) 回复
  • 5.finian
  • "REST架构遵循了CRUD原则"这个说法不对,首先,CRUD术语一般用在数据库或其他持久层,用在架构风格上似乎不太妥;其次,REST并没有规定对资源的操作就只有HTTP那四种常见的操作,而是建议充分利用HTTP的特性
  • 2009/3/25 17:07:47   支持(10)反对(5) 回复
  • 6.日光博客
  • 貌似看不懂,好好学习一下
  • 2009/3/13 15:25:55   支持(7)反对(3) 回复
  • 7.ooxx
  • 很牛很牛逼的博客!
    这个有点复杂了!!!
  • 2009/3/14 12:14:55   支持(8)反对(4) 回复
  • 10.reus
  • 不过是把HTTP再封装了一次而已,有啥新意哦…… 概念炒作
    tong 于 2009-8-11 20:25:28 回复
    同意
  • 2009/3/13 17:37:04   支持(10)反对(7) 回复
  • 11.保定图库
  • 月光太强了,什么都懂。
  • 2009/3/13 23:34:17   支持(9)反对(6) 回复
  • 12.yujian
  • IIS服务器默认是不支持ASP文件的PUT和DELETE操作,默认会返回“403 - Forbidden”错误.经常会遇到这样的网页问题
  • 2009/3/13 9:05:01   支持(7)反对(5) 回复
  • 15.沫117
  • 为什么我没有从中看出简单易用!
  • 2014/3/16 22:01:17   支持(8)反对(6) 回复
  • 16.乐者为王
  • 不错,有时间好好研究一下,如果合适,也正好应用到网站中去,不行就算长见识了
  • 2009/3/13 8:46:16   支持(10)反对(9) 回复
  • 17.fpc
  • 我是一直关注月光的博客的哦!一直在学习。
  • 2009/3/13 10:37:51   支持(10)反对(9) 回复
  • 20.络菲博客
  • 月光推荐了新技术,我觉的还是把老技术练熟。把ASP掌握透彻了对我来有很大的用了。
  • 2009/3/14 0:04:14   支持(12)反对(11) 回复
  • 21.FXYeah
  • SOAP早就听说,不知是否有成熟的应用?!
  • 2009/3/13 8:53:29   支持(9)反对(9) 回复
  • 26.hehe
  • 以后最好能多加代码注释啊 老大
  • 2010/3/27 11:01:44   支持(9)反对(10) 回复
  • 27.shit
  • 《RESTful Web Services》这本书的英文影印本竟然比中文翻译便宜23元,真是无语!!
  • 2009/3/13 8:52:04   支持(9)反对(11) 回复
  • 28.zaban001
  • 多年来一直看月光博客,学到不少东西~
  • 2009/3/13 10:24:55   支持(12)反对(14) 回复
  • 29.蓝天博客
  • 月光博客文章写深了就人会说看不懂,写浅了又有人说质量不行。读者真是难伺候!
  • 2009/3/13 12:35:26   支持(5)反对(7) 回复
  • 30.grnnet
  • 看来月光很难满足大家的口味啊,呵呵!为了满足大家的口味来写东西,就不是真正意义上的博客了。
  • 2009/3/13 12:54:22   支持(7)反对(9) 回复
  • 32.2323
  • 看来月光很难满足大家的口味啊,呵呵!为了满足大家的口味来写东西,就不是真正意义上的博客了。
  • 2009/3/13 13:51:14   支持(5)反对(8) 回复
  • 34.houxs
  • 这个还真是一个新的东西,以前没怎么接触过。
    感觉是针对某些特定问题使用起来效果比较好
  • 2009/3/13 8:49:28   支持(6)反对(10) 回复
  • 35.梅花开
  • 要经常来逛逛,努力学习,同时欢迎大家光临我的博客。
  • 2009/3/13 9:03:32   支持(5)反对(9) 回复
  • 36.独行剑客
  • 想起以前看web service的痛苦回忆
  • 2009/3/13 23:06:03   支持(6)反对(10) 回复
  • 39.日光博客
  • 月光怎么老是搞这么高深莫测的东东啊?
  • 2009/3/13 8:41:30   支持(4)反对(10) 回复

发表评论:

 请勿发送垃圾信息、广告、推广信息或链接,这样的信息将会被直接删除。

订阅博客

  • 订阅我的博客:订阅我的博客
  • 关注新浪微博:关注新浪微博
  • 关注腾讯微博:关注腾讯微博
  • 关注认证空间:关注QQ空间
  • 通过电子邮件订阅
  • 通过QQ邮件订阅

站内搜索

热文排行


月度排行

本站采用创作共用版权协议, 要求署名、非商业用途和相同方式共享. 转载本站内容必须也遵循“署名-非商业用途-相同方式共享”的创作共用协议.
This site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License.