0

Webサービスに接続してデータを取得しようとしましたが、成功しませんでした。これが私がしたことです。

これは私が接続しようとしているWebサービスですhttp://www.rcsb.org/pdb/software/rest.do

これが私のexample.hファイルです:

#import <Foundation/Foundation.h>

@interface example : NSObject {

    NSMutableData *receivedData;
}
@property(nonatomic, retain) NSMutableData *receivedData;

- (void) getDataFromServer;
@end

これが私のexample.mファイルです:

「example.h」をインポートします

@implementation example

@synthesize receivedData;

-(void) getDataFromServer {
    //prepare request
    NSString *urlString = [NSString stringWithFormat:@"http://www.rcsb.org/pdb/rest/search/"];
    NSMutableURLRequest *theRequest = [[NSMutableURLRequest alloc] init];
    [theRequest setURL:[NSURL URLWithString:urlString]];
    [theRequest setHTTPMethod:@"POST"];
    
    NSString *myXmlQuery = [[NSString alloc] initWithFormat:@"<?xml version=\"1.0\" encoding=\"UTF-8\"?><orgPdbQuery><version>head</version><queryType>org.pdb.query.simple.AdvancedKeywordQuery</queryType><description>Text Search for: chloro</description><keywords>chloro</keywords></orgPdbQuery>"];
    
    
    //set Headers
    NSString *contentType = [NSString stringWithFormat:@"application/xml"];
    [theRequest addValue:contentType forHTTPHeaderField:@"Content-Type"];
    [theRequest addValue:[NSString stringWithFormat:@"%ld", [myXmlQuery length]] forHTTPHeaderField:@"Content-Length"];
    
    //create the Body
    NSMutableData *postBody = [NSMutableData data];
    
    [postBody appendData:[[NSString stringWithFormat:@"<xml>"] dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[myXmlQuery dataUsingEncoding:NSUTF8StringEncoding]];
    [postBody appendData:[[NSString stringWithFormat:@"</xml>"] dataUsingEncoding:NSUTF8StringEncoding]];
    
    
    //post
    [theRequest setHTTPBody:postBody];
    
    NSLog(@"%@", myXmlQuery);
    
    //get response
    NSHTTPURLResponse *urlResponse = [[NSHTTPURLResponse alloc] init];
    NSError *error = [[NSError alloc] init];
    NSData *responseData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&urlResponse error:&error];
    NSString *result = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
    NSLog(@"Response code- %ld",[urlResponse statusCode]);
    NSLog(@"Response: %@", result);
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
    NSLog(@"in didReceiveResponse....setting receivedData to zero");
    //[receivedData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    NSLog(@"In didReceiveData...receiving data and appending to receivedData");
    [receivedData appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"Connection failed with error");
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSLog(@"in connectionDidFinishLoading");
    NSLog(@"Succeeded! Received %ld bytes of data", [receivedData length]);
}

@end

これに対する応答としてhtmlページを取得しています。さらに、出力にNSLogステートメントが含まれていないため、connectionDidFinishLoadingが呼び出されていません。私が取得しているのは、接続しようとしているURLのhtmlバージョンだけです。

どんな種類の助けもいただければ幸いです。ありがとうございました。

PS:このテキストを適切にフォーマットしようとしていますが、自動的にこのようにフォーマットされます。ご不便おかけしてすみません。

4

1 に答える 1

0

2つの異なることをしようとしているようです。まず、URLローディングシステムプログラミングガイドをご覧になることをお勧めします。NSHTTPURLResponse*また、それがあなたのために世話をするので、あなたは作成する必要はありません。

次に、NSURLConnectionDelegateプロトコルに準拠せずに、またはクラスをデリゲートとして追加せずに、プロトコルを使用しようとしています。これは、メインスレッドをブロックする方法とは大きく異なりsendSynchronousRequest、デリゲートセットは必要ありません。これは、そのメソッドが応答を待機し、他のコードの実行を許可しないためです(したがってスレッドをブロックします)。本当に素晴らしいStackOverflowの質問と回答があり、あなたと非常によく似ています。

一言で言えば:

  1. インターフェースに準拠し<NSURLConnectionDelegate>ます。
  2. のプロパティを作成しますNSURLConnection*
  3. 使用するself.myConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
  4. NSURLConnectionDelegateこれで、呼び出されているプロトコルメソッド(、、connectionDidFinishLoading:など)に依存できますconnection:didReceiveData:
  5. ヒットconnectionDidFinishLoading:すると、ダウンロードしたデータの使用を開始できます。
于 2013-01-16T06:20:57.493 に答える