iPhone中调用WCF RESTful Service

89467606 2011-04-28

在前面我们介绍过跨平台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中拖一个简单的界面,如下图,分别调用服务端的三个方法:

iPhone中调用WCF RESTful Service

定义下面三个方法与三个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格式的数据

iPhone中调用WCF RESTful Service

2、获取xml格式的数据

iPhone中调用WCF RESTful Service

相关推荐