2012年2月12日日曜日

SOAP レスポンスの受信


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 件のコメント: