iPhone中调用WCF RESTFUL Service

来源:互联网 发布:r语言lda函数源码 编辑:程序博客网 时间:2024/04/30 08:46

转:http://www.cnblogs.com/zhuqil/archive/2011/04/26/iphone-restful-wcf.html

在前面的一篇文章:跨平台iPhone中调用WCF服务中讲述的如何在iPhone中调用WCF服务。我现在开发是调用webservice的,方式和那篇文章一样。需要定义soap,然后异步去调用服务端的方法,等服务端执行完成,然后在iPhone客户端接受返回的XML,最后解析返回的XML。这种方式用起来非常的不方便,每一次调用即需要写自定义的soap,又要解析XML。这篇文章我将讲述一下如何调用restful方式的WCF服务。

    REST(Representational State Transfer)是一种轻量级的Web Service架构风格,其实现和操作明显比SOAP和XML-RPC更为简洁,可以完全通过HTTP协议实现,还可以利用缓存Cache来提高响应速度,性能、效率和易用性上都优于SOAP协议。使用WCF创建restful分格的服务是非常方便的。这篇文章,我通过一个demo来展示如何在iPhone中调用wcf restful service。

创建一个wcf restful service。

1、创建一个数据交换实体类

复制代码
/// <summary> /// User实体类 /// </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、服务契约:定义了三个方法,分别用来获取用户的XML格式、json格式以及创建用户。

复制代码
[ServiceContract] public interface IService1 { /// <summary> /// 创建用户 /// </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> /// 创建用户信息 /// </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、服务实现:这里简单处理。

复制代码
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创建的wcf服务,需要在.svc文件中加入下面代码:

Factory="System.ServiceModel.Activation.WebServiceHostFactory"

5、在web.config中将绑定方式改成webHttpBinding

6、在iis发布服务。

iPhone客户端调用:

    这里使用ASIHTTPRequest,它是一个直接在CFNetwork上做的开源项目,提供了一个比官方更方便更强大的HTTP网络传输的封装,非常的好用。

在xcode中拖一个简单的界面,如下图,分别调用服务端的三个方法:

定义下面三个方法与三个button的点击事件对应:

- (IBAction)fetchXML:(id)sender;- (IBAction)fetchJson:(id)sender;- (IBAction)createJson:(id)sender;

三个点击事件的具体实现:下面的代码为了简单起见,直接将xml和json输入。比较好的做法是:在iPhone也定义一个User类,将json或者XML转换为User实体对象。

复制代码
- (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:@"创建用户" message:response delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; [alertView show]; [alertView release]; }}
复制代码

输出结果:

1、获取json格式的数据

2、获取xml格式的数据

3、创建一个用户实体:

总结:本文通过一个简单的例子说明了如何在iPhone中调用wcf restful服务。你会感觉到这个方式,比去定义soap去调用要好很多,如果你有更方便的方式,请一定要告诉我哈。

本文代码:http://files.cnblogs.com/zhuqil/sourcecode.rar

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 激素药膏用多了怎么办 8岁儿童牙齿不齐怎么办 两个牙齿之间有缝隙怎么办 蛀牙就剩牙根了怎么办 牙龈发白像烂了怎么办 3岁宝宝牙龈肿痛怎么办 1岁宝宝牙龈肿痛怎么办 牙疼引起的发烧怎么办 2岁小儿牙龈红肿怎么办 宝宝出牙牙龈红肿怎么办 3岁宝宝牙龈红肿怎么办 1岁宝宝牙龈红肿怎么办 4岁宝宝牙龈红肿怎么办 儿童牙黑了怎么办啊 牙黑了掉了一块怎么办 1岁幼儿牙齿腐蚀怎么办 我的大牙变黑了怎么办 牙齿里面黑了疼怎么办 最里面的牙黑了怎么办 牙龈的肉裂开了怎么办 有蛀牙怎么办可以变好么 拔智齿没拔干净怎么办 蛀牙只剩牙根了怎么办 牙掉的就剩牙根怎么办 蛀牙牙冠都掉了怎么办 拔智齿断了牙根怎么办 牙肉肿痛有脓包怎么办 种植牙到寿命后怎么办 牙齿松动快掉了怎么办 一颗牙齿松动了怎么办 种植牙牙冠掉了怎么办 牙就剩下牙根了怎么办 后面的大牙掉了怎么办 两边大牙都没了怎么办 拔牙把牙根断了怎么办 拔乳牙牙根断了怎么办 拔牙时牙根断了怎么办 孕晚期牙根掉了怎么办 根管治疗后牙裂怎么办 智齿拔断了牙根怎么办 大牙断了牙根还在怎么办