對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
浙公網安備 33010602011771號