對REST架構的理解及Jquery+JSON+RESTful WCF (附源碼)

來源:互聯網
上載者:User

  最近看了一些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協議中預留給能夠將串連改為管道方式的Proxy 伺服器。   

  當然,在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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.