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与命名空间的配置
方法一.
三.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>{&quot;suggest_msg&quot;:&quot;ccccc111cccc&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效果图
注:这个版本是最后一版,以后我大概不会再去做维护了~~~个人觉得这个版本算是目前写的最好的版本
下载地址:https://github.com/kingboyrang/IOSWebservices
最后终极版终于完成了,你会发现这样操作很简单,你懂的,不懂请留言,大家可以一起相互学习交流~~~也可以联系我~~~
联系方式:
QQ:695749595
msn:[email protected]
新浪微博:http://weibo.com/u/2735662583?wvr=5&