SOAPレスポンスは非同期で受信され、受信経過に応じて次の通知がdelegateに送られてきます。
(1) connection:didReceiveResponse: | レスポンスが届いたことの通知 |
(2) connection:didReceiveData: | データ受信中に何度か呼ばれる。 |
(3) connection:didFailWithError: | エラーが発生したときだけ呼ばれる。 |
(4) connectionDidFinishLoading: | 受信完了時に通知。エラー発生時は呼ばれない。 |
コーディングサンプル。
NSData *soapData = [NSMutableData data];
//レスポンスが届いたことの通知
-(void)connection:(NSURLConnection*) connection didReceiveResponse:(NSURLResponse *)response {
[soapData setLength:0];
}
//受信中に何度か呼ばれる。webDataに追加。
-(void)connection:(NSURLConnection*)connention didReceiveData:(NSData *)data {
[soapData appendData:data];
}
//エラー発生時に呼ばれる。
-(void)connection:(NSURLConnection*)connection didFailWithError:(NSError *)error {
soapData = nil;
connection = nil;
//エラー処理
}
//受信完了時に呼ばれる。
-(void)connectionDidFinishLoading:(NSConnection*)connection {
NSLog(@"受信データ: %dbytes", [soapData length]);
NSString *returnedXml =
[[NSString alloc] initWithBytes:[webData mutableBytes]
length:[webData length]
encoding:NSUTF8StringEncoding];
connection = nil;
//受信データの処理
}
レスポンスのタグ名について
DOT.NETではレスポンスタグの名前に"Response"、"Result"が付加されたものがメソッド名となっており、レスポンスからデータ部分を抜き出すのに"Result"で終わっているかどういかで判断するようにしました。これはDOT.NETの慣例で、SOAPの仕様ではそこまで決まっていないようです。DOT.NET以外のサーバーの場合には変更が必要になるでしょう。
戻り値が文字列の場合
レスポンス全体がXMLで返されますが、Resultタグ内はXMLのエスケープが適用された文字列となっています。Wei-Meng Lee氏のSampleのようにNSXMLParserでパースすればアンエスケープされます。
戻り値がbyte[]の場合
Resultタグ内にbase64エンコードされて送られてきます。iOSアプリ側でデコードする必要があります。
String配列の場合
参照: String配列として返す方法
関連Blog
iOS アプリからのSOAP/WebServiceへのアクセス
SOAP レスポンスの受信
SOAP レスポンスのパース
バイナリデータのSOAPレスポンス
SOAPリクエスト/レスポンスとの同期
<参照>
Consuming XML Web Services in iPhone Applications
iPhoneアプリケーションでXML Webサービスを利用する
0 件のコメント:
コメントを投稿