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[email protected]"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[email protected]"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效果圖
ios 調用webservice三次改版
注:這個版本是最後一版,以後我大概不會再去做維護了~~~個人覺得這個版本算是目前寫的最好的版本
下載下傳位址:https://github.com/kingboyrang/IOSWebservices
最後終極版終于完成了,你會發現這樣操作很簡單,你懂的,不懂請留言,大家可以一起互相學習交流~~~也可以聯系我~~~
聯系方式:
QQ:695749595
msn:[email protected]
新浪微網誌:http://weibo.com/u/2735662583?wvr=5&