為了方便在ios下調用webserivce,找來了wsdl2objc這樣一個開源的框架來解析webservice方便在ios下引用。
下面做個小例子。
1.首先是用Asp.net搭建一個測試的webserivce並放在IIS服務器上面
核心代碼如下: 返回一個TTT的泛型集合
//數據加載重新優化
[csharp]
[cpp]
[WebMethod(Description = "TypeTest for ios")]
public List<TTT> getT()
{
List<TTT> ts = new List<TTT>();
for (int i = 1; i <= 9; i++)
{
TTT t = new TTT();
t.name = "x" + i;
t.id = i;
t.pid = 0;
ts.Add(t);
}
return ts;
}
[WebMethod(Description = "TypeTest for ios")]
public List<TTT> getT()
{
List<TTT> ts = new List<TTT>();
for (int i = 1; i <= 9; i++)
{
TTT t = new TTT();
t.name = "x" + i;
t.id = i;
t.pid = 0;
ts.Add(t);
}
return ts;
}
2.下載wsdl2objc,並用wsdl2objc這個工具去對webservice進行解析,得到一份代碼。
wsdl2objc使用也是比較簡單的,我把webserivce寄托在局域網內末IP為241端口為24的機子上,
第二行放入的路徑就是要生成代碼的文件路徑 /Users/lenbol/Desktop/NiceTesttt/NiceTesttt/Service,
然後點擊Parse WSDL, 待程序出現Finished!字樣時,在我的NiceTesttt項目下的Service文件下就生成出了一些代碼,
選中的文件是工具自動生成的,其中WebSerivce文件是把wsdl解析好的關鍵性文件,Produce也是一個服務,其他的文件是每次生成附帶的通用文件。
3.為了對WebService更好地管理,因此建立了一個WebSerivceManager去處理一些邏輯問題。
WebSerivceManager中寫一個方法去調用webserivce並用NSLog暴露調試輸出調用結果。
關鍵代碼:
[cpp]
-(void)getTTT
{
NSMutableArray *result ;
WebServiceSoap12Binding *binding = [WebService WebServiceSoap12Binding];
WebService_getT *request = [[WebService_getT alloc]init];
WebServiceSoap12BindingResponse *respone=[binding getTUsingParameters:request];
for(id mine in respone.bodyParts)
{
if([mine isKindOfClass:[WebService_getTResponse class]])
{
[request release];
result=[mine getTResult].TTT;
}
}
for(WebService_TTT* t in result)
{
NSLog(@"name: %@ id:%d - pid:%d ",t.name,[t.id_ intValue] ,[t.pid intValue]);
}
}
-(void)getTTT
{
NSMutableArray *result ;
WebServiceSoap12Binding *binding = [WebService WebServiceSoap12Binding];
WebService_getT *request = [[WebService_getT alloc]init];
WebServiceSoap12BindingResponse *respone=[binding getTUsingParameters:request];
for(id mine in respone.bodyParts)
{
if([mine isKindOfClass:[WebService_getTResponse class]])
{
[request release];
result=[mine getTResult].TTT;
}
}
for(WebService_TTT* t in result)
{
NSLog(@"name: %@ id:%d - pid:%d ",t.name,[t.id_ intValue] ,[t.pid intValue]);
}
}由於在.net下服務方法返回的是一個LIST集合,在IOS下需要用用一個可變數組(NSMutableArray)去接收結果。
在這個方法中可以看到,開始NSMutableArray *result ;是建立一個可變數據為結果做准備。
然後WebServiceSoap12Binding *binding = [WebService WebServiceSoap12Binding];是建立一個soapbinding的對象。
接下來WebService_getT *request = [[WebService_getT alloc]init];是建立一個request的對象,這個對象可以放入傳入的參數,由於測試的服務無參數,在這個對象中也就不用傳入參數,但為了調用服務,還是必須聲明這個對象不然會報錯的~
接著就是用一個soap12bindingResponse的對象去處理結果 並循環遍歷把結果賦值給開始聲明的可變數組result,最後循環輸出結果。
調用getTTT:
[cpp]
2013-07-09 10:03:02.128 NiceTesttt[1016:c07] name: x1 id:1 - pid:0
2013-07-09 10:03:02.130 NiceTesttt[1016:c07] name: x2 id:2 - pid:0
2013-07-09 10:03:02.130 NiceTesttt[1016:c07] name: x3 id:3 - pid:0
2013-07-09 10:03:02.130 NiceTesttt[1016:c07] name: x4 id:4 - pid:0
2013-07-09 10:03:02.131 NiceTesttt[1016:c07] name: x5 id:5 - pid:0
2013-07-09 10:03:02.131 NiceTesttt[1016:c07] name: x6 id:6 - pid:0
2013-07-09 10:03:02.131 NiceTesttt[1016:c07] name: x7 id:7 - pid:0
2013-07-09 10:03:02.172 NiceTesttt[1016:c07] name: x8 id:8 - pid:0
2013-07-09 10:03:02.175 NiceTesttt[1016:c07] name: x9 id:9 - pid:0
2013-07-09 10:03:02.128 NiceTesttt[1016:c07] name: x1 id:1 - pid:0
2013-07-09 10:03:02.130 NiceTesttt[1016:c07] name: x2 id:2 - pid:0
2013-07-09 10:03:02.130 NiceTesttt[1016:c07] name: x3 id:3 - pid:0
2013-07-09 10:03:02.130 NiceTesttt[1016:c07] name: x4 id:4 - pid:0
2013-07-09 10:03:02.131 NiceTesttt[1016:c07] name: x5 id:5 - pid:0
2013-07-09 10:03:02.131 NiceTesttt[1016:c07] name: x6 id:6 - pid:0
2013-07-09 10:03:02.131 NiceTesttt[1016:c07] name: x7 id:7 - pid:0
2013-07-09 10:03:02.172 NiceTesttt[1016:c07] name: x8 id:8 - pid:0
2013-07-09 10:03:02.175 NiceTesttt[1016:c07] name: x9 id:9 - pid:0
nice!這樣一個簡單的webserivce調用就實現了~