天天看點

ios 調用webservice三次改版

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三次改版

或者使用方法二.

ios 調用webservice三次改版

 三.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>{&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三次改版
注:這個版本是最後一版,以後我大概不會再去做維護了~~~個人覺得這個版本算是目前寫的最好的版本      
下載下傳位址:https://github.com/kingboyrang/IOSWebservices       

最後終極版終于完成了,你會發現這樣操作很簡單,你懂的,不懂請留言,大家可以一起互相學習交流~~~也可以聯系我~~~

聯系方式:

QQ:695749595

msn:[email protected]

新浪微網誌:http://weibo.com/u/2735662583?wvr=5&

iOS