由於公司的服務全都是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
頭文件中,暴露如下方法
2.SoapUtility 文件是用來封裝soap消息的。SoapUtility調用DDXMLElement+WSDL
在SoapUtility頭文件中,暴露如下方法
3.服務調用,上面,都把Soap消息給準備好了。那麼最後一步就是服務的調用了。這裏分兩種調用方式:同步和異步。
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
歡迎你們給意見。