对REST架构的理解及Jquery+JSON+RESTful WCF (附源码)

  最近看了一些REST架构风格的介绍,谈谈自己对REST的理解总结一下自己的认识。本文只最为个人阶段性的成果,供对REST开发有兴趣的童鞋参考。若有理解有误的地方恳请大侠指教。

  REST看了好多天了,自己也写了一些DEMO程序加深了对他的理解。晚上突然发现还有个微软之前还发布过一个插件名称(WCF REST Starter Kit Preview 2.msi,下载地址:http://aspnet.codeplex.com/releases/view/24644),供给大家使用。供作为个人第一篇介绍REST风格的WCF文章,本文就从这个插件的最基本的使用说起。

  本文分为两个部分:

  1、REST简要介绍

  2、JQ+JSON+ WCF(REST)以及C#客户端调用RESTful 的WCF服务的DEMO

  3、REST WCF的 help页面

*REST简要介绍

   首先介绍一下何为REST。REST全称呼为Representational State Transfer,中文翻译为:表述性状态转移。它不是一种框架,也不是一种规范,而是一种网络应用程序的设计风格和开发方式可以降低开发的复杂性,提高系统的可伸缩性。REST的设计原则有一下几点:

  1、网络上的所有事物都被抽象为资源(Resource)。如:图片、音乐、服务

  2、网络上的资源都有一个唯一标识符(Unique Identity)即URI (UniformResource Identifier)

  3、对资源的操作通过统一的通用接口规范来访问。如:使用HTTP标准动词GET、POSt、DELETE、PUT来进行访问。

  4、对资源的访问不会改变它的唯一标识符,即URI不变

  5、所有的操作都是无状态的。

  由于REST是基于HTTP协议的。所以以上原则中的第三点也很容易理解。同样,由于它的这一特点,只要客户端通过HTTP协议的方式Service支持访问资源的方式,RESTful Service都会做出相应的处理。当然,由于它天生的特点,跨平台也就不成问题了。

  当然:HTTP一共有8个动词来表明对客户端请求的资源的不同操作,分别为:

  • OPTIONS
    返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。
  • HEAD
    向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
  • GET
    向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web Application中。其中一个原因是GET可能会被网络蜘蛛等随意访问。
  • POST
    向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
  • PUT
    向指定资源位置上传其最新内容。
  • DELETE
    请求服务器删除Request-URI所标识的资源。
  • TRACE
    回显服务器收到的请求,主要用于测试或诊断。
  • CONNECT
    HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。   

  当然,在RESTful Service 中,通过GET、POST、PUT、DELETE对资源进行操作。

*DEMO示例

 首先介绍换开发环境(安装下载下来的WCF REST Starter Kit Preview 2):

  环境:VS 2008 +WCF REST Starter Kit Preview 2。

  1、首先建立项目,如下图:

  2、项目建好后的结构如下图:

      

    

Service的定义如下:

 public class Service : SingletonServiceBase<SampleItem>, ISingletonService<SampleItem>

{

/**/

}

有WCF经验的大侠,一样就能想到ISingletonService<SampleItem>,肯定是对应的服务契约。对于Service的代码以及

泛型类SingletonServiceBase<SampleItem>, ISingletonService<SampleItem>的代码都是系统自动给生成的,我就

不给出类的源码了,只说说ISingletonService<SampleItem>,是如何指定资源返回的公共接口规范的。

       [OperationContract]
        [WebHelp(Comment = "Returns the item in JSON format.")]
        [WebGet(UriTemplate = "?format=json", ResponseFormat = WebMessageFormat.Json)]
        TItem GetItemInJson();
        [OperationContract]
        [WebHelp(Comment = "Returns the item in XML format.")]
        [WebGet(UriTemplate = "")]
        TItem GetItemInXml();

   [WebHelp(Comment = "Initializes the item based on the incoming JSON.")]
        [OperationContract]
        [WebInvoke(Method = "POST", UriTemplate = "?format=json", ResponseFormat =     WebMessageFormat.Json)]
        TItem AddItemInJson(TItem initialValue);

对资源公共接口是通过WebGetAttribute,WebInvokeAttribute中Method以及UriTemplate模板制定的。Method定义了访问资源的动作,POST、GET(或者其他,这里仅仅列出2中不同的动作加以说明)。而UriTemplate则指定了对资源访问的URI。在REST WCF中,对服务契约的定义中,UriTemplate是必不可少的。

   1、JQ调用的代码如下:

   $.ajax({
	 
	        type: "GET",
	 
	        url: "Service.svc/?format=json",
	 
	        dataType: "json",
	 
	        contentType: "application/json; charset=utf-8",
	 
	        success: function(json) { alert(json.Value) },
	 
	        error: function(error) {
	 
            alert("调用出错" + error.responseText);
	 
	        }
    });

 

注意:AJAx调用中URL路径的写法。 由于我这里制定用JSON格式,要求服务端返回JSON数据格式如果路径不这样写而写成"",则调用会抛异常,如下图:

路径:Service.cs与Service.cs?Format=JSON在ISingletonService<T>中都有定义(以上在给出指定资源返回的公共接口规范实例代码中前面两种即为这两个资源的访问方式)。

在正确访问下的结果如下图:

注意:有心的同学可能会注意到,这里获取JSON数据时候,已经不想是通过SOAP方式访问服务后通过JSON.d进行数据获取。在此处是通过JSON.Value。因为在本例中,泛型类用的是SampleItem,所以这里通过其属性Value获取。不同的实体对象就应该具体分析了。

  2、C#调用:

     2.1、WebClient

     using (WebClient client = new WebClient())
            {
                string str = client.DownloadString("http://localhost:3103/Service.svc/");

                Response.Write(str);
            }

  2.2   HttpWebRequest、HttpWebResponse。

       HttpWebRequest webRequest = WebRequest.Create("http://localhost:3103/Service.svc/?format=json") as HttpWebRequest;
            HttpWebResponse webResponse = webRequest.GetResponse() as HttpWebResponse;
            using (StreamReader reader = new StreamReader(webResponse.GetResponseStream()))
            {
                Response.Write(reader.ReadToEnd());
            }

结果如下图:

在以上两种访问方式中,如果将路径换成http://localhost:3103/Service.svc/?format=json,则会讲JSON对象,以字符串形式输出。有兴趣的同学可以试试。

3、REST WCF help页面

 我们在地址栏输入: http://localhost:3103/Service.svc/,则会显示资源调用结果。在地址后面加上help(http://localhost:3103/Service.svc/)即可看到帮助页面。如下图:

上面的访问方式,方式等等信息已经展示的很明显了,就不用多做说明了。当然,这个帮助页面在REST WCF4.0中有

更加友好,清晰的表现形式。以后又机会再向大家介绍。

 

总结:1、契约中定义接口的访问方式(通过UriTemplate指定),方法(通过Method)指定

   2、JQ如何调用JSON数据格式与REST WCF Service通讯。

   3、服务的帮助(help)页面的查看方式

另:1、本文面向初学者,让我们对它有个大概了解。后续会有一些相对深入的介绍

  2、我的DEMO中对数据契约SampleItem没有指定[DataContract]、[DataMember],我是手工加上的。

  3、http://localhost:3103/Service.svc/在浏览器只能直接查看到最终调用结果,而http://localhost:3103/Service.svc/?format=json则会提示下载文件。将文件下载后,里面的内容和C#中通过模拟Http请求的结果是一样的。

源码下载:http://download.csdn.net/detail/tyb1222/3711915

参考:http://blog.csdn.net/tianmo2010/article/details/6456571

   http://baike.baidu.com/view/1077487.htm

posted @ 2011-10-24 02:50  tyb1222  阅读(13102)  评论(15编辑  收藏  举报