IOS 調用WebService(同步和異步)

由於公司的服務全都是webservice,每次總要花費大量時間在調試服務上面,乾脆就寫了一個解析wsdl的項目,但願未來能用上吧。還未通過烘焙,有問題,還請高手點播點播。git

下面,我拿天氣服務的wsdl做爲例子吧。github

服務的WSDL地址:http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?wsdlweb

WSDL包含如下節點數據結構

definitions 根節點異步

根節點下面有如下節點:post

types 數據類型定義。方法的參數名都包含在裏面。ui

message 消息數據結構。spa

portType 描述服務和服務的方法。3d

binding 描述Web Service的通訊協議。調試

service 描述Web Service 的訪問點的集合。

下面對來一步一步解析如何根據wsdl 生成SOAP 消息體。

1.添加一個類擴展,以下圖DDXMLElement+WSDL.h和DDXMLElement+WSDL.m


201307270824.jpg

頭文件中,暴露如下方法


201307270825.jpg

2.SoapUtility 文件是用來封裝soap消息的。SoapUtility調用DDXMLElement+WSDL

在SoapUtility頭文件中,暴露如下方法


201307270825.jpg

3.服務調用,上面,都把Soap消息給準備好了。那麼最後一步就是服務的調用了。這裏分兩種調用方式:同步和異步。


201307270826.jpg

4.使用方法,下面是天氣服務的調用例子

//參數列表

NSDictionary *dic=@{@"theCityName": cityname};

//方法名

NSString *methodName=@"getWeatherbyCityName";

  

//封裝soap信封

SoapUtility *soaputility=[[SoapUtility alloc] initFromFile:@"WeatherWebService"];

NSString *postData=[soaputility BuildSoapwithMethodName:@"getWeatherbyCityName" withParas:dic];

  

//初始化服務

SoapService *soaprequest=[[SoapService alloc] init];

soaprequest.PostUrl=@"http://www.webxml.com.cn/WebServices/WeatherWebService.asmx";

soaprequest.SoapAction=[soaputility GetSoapActionByMethodName:methodName SoapType:SOAP];

  

if (isSync) {

//同步方法

ResponseData *result= [soaprequest PostSync:postData];

[self.result setText:result.Content];

}

else{

//異步請求

[soaprequest PostAsync:postData Success:^(NSString *response) {

[self.result setText:response];

} falure:^(NSError *response) {

[self.result setText:response.description];

}];

}

5.代碼實現

https://github.com/xujialiang/SOAP-IOS

歡迎你們給意見。

相關文章
相關標籤/搜索