ios 调用webservice三次改版

来源:互联网 发布:java principal 编辑:程序博客网 时间:2024/05/17 23:20

http://wuchaorang.2008.blog.163.com/blog/static/488918522013710103516494/

喜欢简单,纯洁无邪的我,请下载原生版(基于NSURLConnection实现,没有使用第三方类库)

http://wuchaorang.2008.blog.163.com/blog/static/48891852201412132418800/

喜欢羞涩,懵懂无知的我,请下载版本一

http://wuchaorang.2008.blog.163.com/blog/static/488918522012101082452642/

喜欢自由,热情奔放的我,请下载版本二

http://wuchaorang.2008.blog.163.com/blog/static/488918522013529114127666/

喜欢单纯,依然冒点傻气的我,请来这里下载版本三,嘿嘿~~~

注:建议新手们去了解一下soap的知识,不要到时候不懂怎么用~~~也可以去问问写webservice的人,它会告诉你怎么传值,更简单的方法在浏览器中输入webservice url就可以看到那些你要调用的方法,并如何使用~~~

手把手教你做iphone的soap应用:http://www.cocoachina.com/bbs/read.php?tid=16561  新手可以看看

我只是对这些进行了封装,直接传数组了~~~

一.版本三改进项说明

(1)webservice调用类新增了静态方法访问

(2)修改了webservice调用时返回结果的对象

(3)重写了xml解析类,包含webservice调用时返回xml解析,我度娘,google了很多文章,大多数人写的都是遍历查询以及简单的xml读取为主,对于webservice调用返回xml的,我发现没有人知道怎么去解析~~一不小心就被我搞定了,各种开心与happy中~~~我单独写了一个xml解析的demo,可以去以下这个地址下载观看~~~

http://wuchaorang.2008.blog.163.com/blog/static/48891852201379102829622/

(4)考虑的类库的封装,把webserviceUrl与命名空间做了改动,但不影响使用

(5)新增了webservice类无参数同步与异步的直接调用

二.配置使用

(1)webservice url与命名空间的配置

方法一.

ios 调用webservice三次改版 - wuchaorang.2008 - rang
或者使用方法二.
ios 调用webservice三次改版 - wuchaorang.2008 - rang
 

 三.webservice调用使用说明

(1)同步请求

a.无参数的同步请求

ServiceResult *result=[ServiceHelper syncMethodName:@"getForexRmbRate"];    NSLog(@"同步请求xml=%@\n",result.xmlString);    NSArray *arr=[result.xmlParse soapXmlSelectNodes:@"//ForexRmbRate"];    NSLog(@"解析xml结果=%@\n",arr);

b.有参数的同步请求

//参数NSMutableArray *params=[NSMutableArray array];[params addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"queryBFlist",@"tradeCode", nil]];[params addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"123",@"account", nil]];[params addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"123",@"password", nil]];[params addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"01",@"accountType", nil]];     //设置传递对象ServiceArgs *args=[[[ServiceArgs alloc] init] autorelease];args.methodName=@"AddMethod";//webservice方法名args.soapParams=params;//方法参数//调用ServiceResult *result=[ServiceHelper syncService:args];NSLog(@"同步请求xml=%@\n",result.xmlString);//查询节点NSArray *arr=[result.xmlParse soapXmlSelectNodes:@"//ForexRmbRate"];    NSLog(@"解析xml结果=%@\n",arr);

(2)异步请求
a.无参数的异步请求

[ServiceHelper asynMethodName:@"getForexRmbRate" success:^(ServiceResult *result) {

//查询xml节点        NSArray *arr=[result.xmlParse soapXmlSelectNodes:@"//ForexRmbRate"];        NSLog(@"解析xml结果=%@\n",arr);

    } failed:^(NSError *error, NSDictionary *userInfo) {        NSLog(@"error=%@\n",[error description]);    }];

b.有参数的异步请求

//参数NSMutableArray *params=[NSMutableArray array];[params addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"queryBFlist",@"tradeCode", nil]];[params addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"123",@"account", nil]];[params addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"123",@"password", nil]];[params addObject:[NSDictionary dictionaryWithObjectsAndKeys:@"01",@"accountType", nil]];     //设置传递对象ServiceArgs *args=[[[ServiceArgs alloc] init] autorelease];args.methodName=@"AddMethod";//webservice方法名args.soapParams=params;//方法参数//调用[ServiceHelper asynService:args success:^(ServiceResult *result) {       NSArray *arr=[result.xmlParse soapXmlSelectNodes:@"//ForexRmbRate"];        NSLog(@"解析xml结果=%@\n",arr);            } failed:^(NSError *error, NSDictionary *userInfo) {        NSLog(@"error=%@\n",[error description]);    }];

前面所说的都是基于.net写的webservices的调用,而java写的webservice基于soap调用又有点稍微不一样,我这里举一个简单例子:
a.假设:
webservice url为:http://115.28.0.155:8080/dxqd/SuggestMessage
webservice的命空间为:http://webservice.dxqd.com/
调用的方法名为:savceSuggest
参数名为:arg0
b.传递的soap内容为:

<?xml version="1.0"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:SuggestService="http://webservice.dxqd.com/" xsl:version="1.0"><soap:Body><SuggestService:savceSuggest><SuggestService:arg0>{&amp;quot;suggest_msg&amp;quot;:&amp;quot;ccccc111cccc&amp;quot;}</SuggestService:arg0> </SuggestService:savceSuggest></soap:Body></soap:Envelope>

这里稍微解释一下:
在浏览器中打开:http://115.28.0.155:8080/dxqd/SuggestMessage?wsdl可以看到如下一段内容,注意看红色字
如果地址无法访问,请看这里有更清楚的解释:http://wuchaorang.2008.blog.163.com/blog/static/48891852201391695530894/

<wsdl:service name="SuggestService"><wsdl:port name="SuggestPort" binding="tns:SuggestBinding"><SOAP:address location="http://115.28.0.155:8080/dxqd/SuggestMessage"/></wsdl:port></wsdl:service>

节点<SuggestService:savceSuggest>是由<wsdl:service name="SuggestService">中的(name:调用的方法名)构成
在看一下wsdl中参数

<xs:element name="savceSuggest"><xs:complexType><xs:sequence><xs:element minOccurs="0" name="arg0" nillable="true" type="xs:string"/></xs:sequence></xs:complexType></xs:element>

从中我们可以看出,参数名为arg0,数据类型为string字符串
节点<SuggestService:arg0>就表示要传递的参数内容c.调用:

NSString *path=[[NSBundle mainBundle] pathForResource:@"soap" ofType:@"txt"];

//url为webservice url+方法名 NSURL *webURL=[NSURL URLWithString:@"http://115.28.0.155:8080/dxqd/SuggestMessage/savceSuggest"]; ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:webURL]; NSString *soapMessage=[NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil]; NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]]; //以下对请求信息添加属性前四句是必有的,第五句是soap信息。 [request addRequestHeader:@"Host" value:[webURL host]]; [request addRequestHeader:@"Content-Type" value:@"text/xml; charset=utf-8"];[request addRequestHeader:@"Content-Length" value:msgLength];

//SOAPAction也就是命名空间 [request addRequestHeader:@"SOAPAction" value:@"http://webservice.dxqd.com/"]; [request setRequestMethod:@"POST"];

//传递soap内容 [request appendPostData:[soapMessage dataUsingEncoding:NSUTF8StringEncoding]]; [request setValidatesSecureCertificate:NO];

//表示30秒请求超时 [request setTimeOutSeconds:30.0]; [request setDefaultResponseEncoding:NSUTF8StringEncoding]; [request setCompletionBlock:^{ NSLog(@"xml=%@\n",request.responseString);//请求成功,输出内容 }]; [request setFailedBlock:^{ NSLog(@"error=%@\n",request.error.description);//请求失败 }]; [request startAsynchronous];

四.demo效果图
ios 调用webservice三次改版 - wuchaorang.2008 - rang
 
注:这个版本是最后一版,以后我大概不会再去做维护了~~~个人觉得这个版本算是目前写的最好的版本
下载地址:https://github.com/kingboyrang/IOSWebservices 

最后终极版终于完成了,你会发现这样操作很简单,你懂的,不懂请留言,大家可以一起相互学习交流~~~也可以联系我~~~

联系方式:
QQ:695749595
msn:rangrang1989@hotmail.com
新浪微博:http://weibo.com/u/2735662583?wvr=5&

0 0
原创粉丝点击