對(duì)REST架構(gòu) 風(fēng)格下WCF的一點(diǎn)補(bǔ)充
這幾天思考REST 架構(gòu)下POST復(fù)雜數(shù)據(jù)類型的問(wèn)題查了寫資料,以及通過(guò)與WCF 大牛------Frank Xulei進(jìn)行了一番交流對(duì)REST有了一些進(jìn)一步的認(rèn)識(shí)。本篇作為:1、REST與SOA兩種架構(gòu)下WCF的異同比較 2、通過(guò)HTTP協(xié)議標(biāo)準(zhǔn)動(dòng)作使用REST WCF 服務(wù) 這兩篇的一個(gè)補(bǔ)充。
起因是這樣的:在SOA架構(gòu)下,一般都是通過(guò)定義服務(wù)契約的方式最終通過(guò)WSDL將元數(shù)據(jù)對(duì)外發(fā)布,以供調(diào)用者使用。也就是說(shuō)在SOA中,通過(guò)服務(wù)契約定義向外公布服務(wù)對(duì)外提供的操作。如果先學(xué)習(xí)SOA,然后接觸REST,可能會(huì)在使用REST的時(shí)候會(huì)沿用SOA下的一些習(xí)慣。我在進(jìn)行REST架構(gòu)下的WCF學(xué)習(xí)過(guò)程中也是沿用了這一思路:先定義服務(wù)接口,然后實(shí)現(xiàn)服務(wù)供消費(fèi)者使用。
后來(lái)仔細(xì)想了想REST架構(gòu)的原則,通過(guò)定義契約接口的方式固然可行,并且在前幾節(jié)中也做了實(shí)現(xiàn)的說(shuō)明。但真的有必要這樣做嗎。?
由于REST架構(gòu)下的服務(wù)通過(guò)公共的連接器接口(主要是指GET,POST,PUT,DELETE)對(duì)服務(wù)進(jìn)行訪問(wèn)。客戶端只需知道服務(wù)的統(tǒng)一資源標(biāo)識(shí)---URI(Uniform Resources Identifier)以及相應(yīng)的HTTP動(dòng)作就行了(可以通過(guò)REST 架構(gòu)下的幫助頁(yè)面,即HTTP://ServiceAddress/help就能知道各個(gè)服務(wù)如何使用)。因此在REST架構(gòu)下,WCF服務(wù)無(wú)需向客戶端暴露元數(shù)據(jù)信息。這也是REST架構(gòu)下,WCF不需要定義服務(wù)契約的原因。由于沒(méi)有元數(shù)據(jù)信息,因此REST WCF服務(wù)也不能通過(guò)添加引用的方式使用。
小結(jié):
1、REST 架構(gòu)下無(wú)需給服務(wù)定義服務(wù)契約(非必須,若定義也行)。
2、REST 架構(gòu)下的服務(wù)不能添加引用的方式使用。
在面向?qū)ο笳Z(yǔ)言中,操作一般都針對(duì)對(duì)象而言。REST中如何POST自定義類型。?下面說(shuō)說(shuō)REST架構(gòu)下,復(fù)雜數(shù)據(jù)類型的POST操作。(代碼下載)
服務(wù)的實(shí)現(xiàn):
[OperationContract]
[WebInvoke(UriTemplate = "Person/Post")]
public string Post(Person person)
{
return person.Name + person.Tel;
}
調(diào)用方式如下:
static void InvokeMutiType()
{
using (MemoryStream ms = new MemoryStream())
{
WebClient webClient = new WebClient();
Person person = new Person { Name = "tyb", Tel = "01021234568" };
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Person));
xmlSerializer.Serialize(ms, person);
ms.Seek(0, SeekOrigin.Begin);
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(ms);
webClient.Headers[HttpRequestHeader.ContentType] = "application/xml";
try
{
string str = webClient.UploadString("http://localhost:6012/RestService.svc/Person/Post", "POST" , xmlDocument.InnerXml);
Console.WriteLine("接收到的數(shù)據(jù)為:{0}", str);
}
catch (WebException exception)
{
Console.WriteLine(exception.Status);
}
}
}
調(diào)用結(jié)果如下圖:

由上可知:對(duì)自定義類型數(shù)據(jù)采用POST操作時(shí),需要通過(guò)序列話然后發(fā)送給服務(wù)端。服務(wù)端在接受到數(shù)據(jù)后能自動(dòng)映射到自定義類型上。
以上通過(guò)WebClient發(fā)送的,也可以通過(guò)HttpWebRequest與HttpWebResponse來(lái)實(shí)現(xiàn)。
浙公網(wǎng)安備 33010602011771號(hào)