ios调用web service

来源:互联网 发布:英克灵智医药软件 编辑:程序博客网 时间:2024/05/19 02:26

网上太多的教程了,可一个个都带着酸溜溜的技术气息,说点人话不难吧。
很多人第一次调用WEB SERVICE的时候可能总是摸不到头脑,连不上接口或者返回不了正确的数据,不知道自己错在哪里。其实真的非常简单。注意几个细节就可以轻松搞定。
今天我展示一个调用天气预报的例子。
首先,找一个网上公共可以用的接口地址,这个WEB SERVICE提供了天气预报的调用接口,地址如下:
http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx
可以用浏览器打开,里面分别写着几个接口的方法名称。其中有一个方法名叫做:
getWeatherbyCityName
服务器端是用ASP.NET实现的,所以我们可以很方便的通过点击这个方法名的链接在网上进行一个测试使用(有些服务器端是JAVA开发的,比如XFIRE等引擎建立的,虽然不如ASP.NET实现的直观,但是调用方法是一样的),看看参数是什么返回的结果是什么。
IOS下使用WEB SERVICEX

IOS下使用WEB SERVICE
看见这个返回的XML内容了吧,这不就是我们想要得到的数据吗。下面我们来用ISO实现在程序里调用WEB SERVICE的方法并获取反馈数据。
我先把大体步骤写下:
1、在项目中添加使用到的框架和库:SystemConfiguration.framework, MobileCoreServices.framework,libz.dylib.
2、编写服务请求,请求的内容很简单,就是描述一下WEB SERVICE的WEB地址,名字空间,还有你想调用的方法名以及给这个方法传递的参数。因为WEB SERVICE使用的SOAP协议来通信吗,所以我们给服务器发送的申请内容肯定也是XML格式的了。
3、接受服务器反馈的数据。
不复杂吧,就3步。下面我把代码贴上来:

- (void)viewDidLoad{[super viewDidLoad];// Do any additional setup after loading the view.matchingElement = @'LoginResult';NSString *soapMessage =[NSString stringWithFormat:@'<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>\n''<soap:Body>\n''<getWeatherbyCityName xmlns='http://WebXml.com.cn/'>\n''<theCityName>%@</theCityName>\n''</getWeatherbyCityName>\n''</soap:Body>\n''</soap:Envelope>\n',@'北京'];NSURL *url = [NSURL URLWithString: @'http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx'];NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];NSString *msgLength = [NSString stringWithFormat:@'%d',[soapMessage length]];[req addValue:@'http://WebXml.com.cn/getWeatherbyCityName' forHTTPHeaderField:@'SOAPAction'];[req addValue:@'text/xml; charset=utf-8' forHTTPHeaderField:@'Content-Type'];[req addValue:msgLength forHTTPHeaderField:@'Content-Length'];[req setHTTPMethod:@'POST'];[req setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];if(conn){webData = [NSMutableData data];//NSLog(@'%@',webData);}}- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{[webData setLength:0];}- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{[webData appendData:data];}- (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{}- (void) connectionDidFinishLoading:(NSURLConnection *) connection{NSLog(@'Done. Received Bytes: %d', [webData length]);NSString *theXML = [[NSString alloc] initWithBytes:[webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];NSLog(@'返回的结果: %@', theXML);}- (void)didReceiveMemoryWarning{[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.}WOW,一股脑放上来,有点蒙是吧。不要急,下面会慢慢分析的。用上面的代码直接复制应该是可以编译成功的,我刚刚试过。先复制到你的代码里RUN一下,能在输出窗口看见反馈信息吗?像下面这样,就说明调试成功了:IOS下使用WEB SERVICE现在是不是有囫囵吞枣的感觉?虽然程序跑起来了,可还不知道到底哪些地方是需要留意的。下面我接着说明。先讲一下服务请求的内容吧,非常EASY,只是一个字符串而已。NSString *soapMessage =[NSString stringWithFormat:@'<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'>\n''<soap:Body>\n''<getWeatherbyCityName xmlns='http://WebXml.com.cn/'>\n''<theCityName>%@</theCityName>\n''</getWeatherbyCityName>\n''</soap:Body>\n''</soap:Envelope>\n',@'北京'];

关键的部分我用粗体字和彩色标注出来了。
getWeatherbyCityName
这个就是我们要调用的方法名称,要注意后面的名字空间,需要跟服务器端保持一致:xmlns=’http://WebXml.com.cn/’ (你可能会问,服务器端的名字空间我怎么知道是什么?!打开WEB SERVICE的地址,其中都有描述的,找xmlns就可以看见)。
theCityName
这个就是方法接受的参数名称了,本例子中使用的参数值是@“北京”。
接下来需要注意的2个参数:

NSURL *url = [NSURL URLWithString:@'http://webservice.webxml.com.cn/WebServices/WeatherWebService.asmx'];//Web Service 的RUL地址[req addValue:@'http://WebXml.com.cn/getWeatherbyCityName'forHTTPHeaderField:@'SOAPAction'];

//注意这里的参数,是名字空间加上接口方法名
下面还要我讲吗?:)接收服务器反馈数据的方法已经赤裸裸的写在代码的最后了,这个方法:

- (void) connectionDidFinishLoading:(NSURLConnection *) connection

看名字也知道它的作用。在里面得到反馈信息就OK了。返回的数据是XML格式的。
关于接收到XML数据再怎么使用本教程就不再赘述了,IOS下有很多开源的第三方XML处理类库,需要的朋友去查阅就好。

0 0
原创粉丝点击