iPhone中調(diào)用WCF RESTful Service
在前面我們介紹過跨平臺iPhone中調(diào)用WCF服務(wù),講述的如何在iPhone中調(diào)用WCF服務(wù)。我現(xiàn)在開發(fā)是調(diào)用webService的,方式和那篇文章一樣。需要定義soap,然后異步去調(diào)用服務(wù)端的方法,等服務(wù)端執(zhí)行完成,然后在iPhone客戶端接受返回的XML,***解析返回的XML。這種方式用起來非常的不方便,每一次調(diào)用即需要寫自定義的soap,又要解析XML。這篇文章我將講述一下如何調(diào)用RESTful方式的WCF服務(wù)。
REST(Representational State Transfer)是一種輕量級的Web Service架構(gòu)風(fēng)格,其實(shí)現(xiàn)和操作明顯比SOAP和XML-RPC更為簡潔,可以完全通過HTTP協(xié)議實(shí)現(xiàn),還可以利用緩存Cache來提高響應(yīng)速度,性能、效率和易用性上都優(yōu)于SOAP協(xié)議。使用WCF創(chuàng)建RESTful分格的服務(wù)是非常方便的。這篇文章,我通過一個demo來展示如何在iPhone中調(diào)用WCF RESTful Service。
創(chuàng)建一個WCF RESTful Service。
1、創(chuàng)建一個數(shù)據(jù)交換實(shí)體類
- /// <summary>
 - /// User實(shí)體類
 - /// </summary>
 - [DataContract]
 - public class User
 - {
 - /// <summary>
 - /// 用戶名
 - /// </summary>
 - [DataMember(Order = 0)]
 - public string Name { get; set; }
 - /// <summary>
 - /// 生日
 - /// </summary>
 - [DataMember(Order = 1)]
 - public string DayOfbirth { get; set; }
 - }
 
2、服務(wù)契約:定義了三個方法,分別用來獲取用戶的XML格式、json格式以及創(chuàng)建用戶。
- [ServiceContract]
 - public interface IService1
 - {
 - /// <summary>
 - /// 創(chuàng)建用戶
 - /// </summary>
 - /// <summary>
 - /// 獲取用戶信息,json格式
 - /// </summary>
 - /// <param name="name">用戶名</param>
 - [OperationContract]
 - [WebGet(
 - UriTemplate = "User/{name}",
 - ResponseFormat = WebMessageFormat.Json)]
 - User GetUser(string name);
 - /// <summary>
 - /// 獲取用戶信息,XML格式
 - /// </summary>
 - /// <param name="name">用戶名</param>
 - /// <remarks>
 - /// </remarks>
 - [OperationContract]
 - [WebGet(
 - UriTemplate = "UserXML/{name}",
 - ResponseFormat = WebMessageFormat.Xml)]
 - User GetUserXML(string name);
 - /// <summary>
 - /// 創(chuàng)建用戶信息
 - /// </summary>
 - /// <param name="name">用戶名</param>
 - /// <param name="dayOfbirth">生日</param>
 - /// <returns></returns>
 - [OperationContract]
 - [WebInvoke(UriTemplate = "User/{name}/{dayOfbirth}",
 - Method = "POST",
 - ResponseFormat = WebMessageFormat.Json)]
 - User CreateUser(string name, string dayOfbirth);
 - }
 
3、服務(wù)實(shí)現(xiàn):這里簡單處理。
- public class Service1 : IService1
 - {
 - public User GetUser(string name)
 - {
 - return new User { Name = name, DayOfbirth = new DateTime(1986, 10, 23).ToString() };
 - }
 - public User GetUserXML(string name)
 - {
 - return new User { Name = name, DayOfbirth = new DateTime(1986, 10, 23).ToString() };
 - }
 - public User CreateUser(string name, string dayOfbirth)
 - {
 - return new User { Name = name, DayOfbirth = dayOfbirth };
 - }
 - }
 
4、對于vs2008創(chuàng)建的wcf服務(wù),需要在.svc文件中加入下面代碼:
- Factory="System.ServiceModel.Activation.WebServiceHostFactory"
 
5、在web.config中將綁定方式改成webHttpBinding
6、在iis發(fā)布服務(wù)。
iPhone客戶端調(diào)用:
這里使用ASIHTTPRequest,它是一個直接在CFNetwork上做的開源項目,提供了一個比官方更方便更強(qiáng)大的HTTP網(wǎng)絡(luò)傳輸?shù)姆庋b,非常的好用。
在xcode中拖一個簡單的界面,如下圖,分別調(diào)用服務(wù)端的三個方法:

定義下面三個方法與三個button的點(diǎn)擊事件對應(yīng):
- - (IBAction)fetchXML:(id)sender;
 - - (IBAction)fetchJson:(id)sender;
 - - (IBAction)createJson:(id)sender;
 
三個點(diǎn)擊事件的具體實(shí)現(xiàn):下面的代碼為了簡單起見,直接將xml和json輸入。比較好的做法是:在iPhone也定義一個User類,將json或者XML轉(zhuǎn)換為User實(shí)體對象。
- - (IBAction)fetchXML:(id)sender
 - {
 - NSURL *url = [NSURL URLWithString:@"http://10.5.23.117:21924/Service1.svc/UserXML/zhuqilin"];
 - ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
 - [request startSynchronous];
 - NSError *error = [request error];
 - if (!error) {
 - NSString *response = [request responseString];
 - UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"xml格式"
 - message:response
 - delegate:nil
 - cancelButtonTitle:@"OK"
 - otherButtonTitles:nil];
 - [alertView show];
 - [alertView release];
 - }
 - }
 - - (IBAction)fetchJson:(id)sender
 - {
 - NSURL *url = [NSURL URLWithString:@"http://10.5.23.117:21924/Service1.svc/User/zhuqilin"];
 - ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
 - [request startSynchronous];
 - NSError *error = [request error];
 - if (!error) {
 - NSString *response = [request responseString];
 - UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"JSON格式"
 - message:response
 - delegate:nil
 - cancelButtonTitle:@"OK"
 - otherButtonTitles:nil];
 - [alertView show];
 - [alertView release];
 - }
 - }
 - - (IBAction)createJson:(id)sender
 - {
 - NSURL *url = [NSURL URLWithString:@"http://10.5.23.117:21924/Service1.svc/User/zhuqilin/1986-09-20"];
 - ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
 - [request setRequestMethod:@"POST"];
 - [request startSynchronous];
 - NSError *error = [request error];
 - if (!error) {
 - NSString *response = [request responseString];
 - UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"創(chuàng)建用戶"
 - message:response
 - delegate:nil
 - cancelButtonTitle:@"OK"
 - otherButtonTitles:nil];
 - [alertView show];
 - [alertView release];
 - }
 - }
 
輸出結(jié)果:
1、獲取json格式的數(shù)據(jù)

2、獲取xml格式的數(shù)據(jù)

3、創(chuàng)建一個用戶實(shí)體:

總結(jié):本文通過一個簡單的例子說明了如何在iPhone中調(diào)用WCFRESTful服務(wù)。你會感覺到這個方式,比去定義soap去調(diào)用要好很多。
【編輯推薦】















 
 
 
 
 
 
 