在前面我们介绍过跨平台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; }
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
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);
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
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 };
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
4、对于vs2008创建的wcf服务,需要在.svc文件中加入下面代码:
Factory="System.ServiceModel.Activation.WebServiceHostFactory"
- 1.
5、在web.config中将绑定方式改成webHttpBinding
6、在iis发布服务。
iPhone客户端调用:
这里使用ASIHTTPRequest,它是一个直接在CFNetwork上做的开源项目,提供了一个比官方更方便更强大的HTTP网络传输的封装,非常的好用。
在xcode中拖一个简单的界面,如下图,分别调用服务端的三个方法:

定义下面三个方法与三个button的点击事件对应:
- (IBAction)fetchXML:(id)sender;
- (IBAction)fetchJson:(id)sender;
- (IBAction)createJson:(id)sender;
- 1.
- 2.
- 3.
三个点击事件的具体实现:下面的代码为了简单起见,直接将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.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
输出结果:
1、获取json格式的数据

2、获取xml格式的数据

3、创建一个用户实体:

总结:本文通过一个简单的例子说明了如何在iPhone中调用WCFRESTful服务。你会感觉到这个方式,比去定义soap去调用要好很多。
【编辑推荐】