2011-09-12 14 views
1

XML APIを介してアクセスしようとしているベースキャンプアカウントがあります。XMLが期待されるときにNSURLConnectionがnullを返す

適切なヘッダーフィールドを使用してNSURLリクエストを作成しました。

NSURL* projectsUrl = [NSURL URLWithString:[self.accountURL stringByAppendingString:@"/projects.xml"]]; 
    NSMutableURLRequest* projectsRequest = [NSMutableURLRequest requestWithURL:projectsUrl]; 

    [projectsRequest setValue:@"application/xml" forHTTPHeaderField:@"Content-Type"]; 
    [projectsRequest setValue:@"application/xml" forHTTPHeaderField:@"Accept"]; 

私は接続を作成して起動します。

NSURLConnection* connection = [[NSURLConnection alloc] initWithRequest:projectsRequest delegate:self]; 
    [connection start]; 
    [connection autorelease]; 

BasecampはHTTP基本認証を使用します。そこで、NSCredentialオブジェクトを使用して以下のように処理します。

-(void) connection:(NSURLConnection*)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge*)authenticationChallenge 
{ 


    if ([authenticationChallenge previousFailureCount] <=2) { 
     NSURLCredential* basecampCredentials; 
     basecampCredentials = [NSURLCredential credentialWithUser:[self username] 
                 password:[self password] 
                 persistence:NSURLCredentialPersistenceNone]; 
     [[authenticationChallenge sender] useCredential:basecampCredentials forAuthenticationChallenge:authenticationChallenge]; 
    }else { 
     [[authenticationChallenge sender] cancelAuthenticationChallenge:authenticationChallenge]; 

    } 

} 

接続からデータを受け取ったとき、私はこれらの代理人と処理します。

-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{ 
    [[self responseData] appendData: data]; 
    NSLog(@"I received %@", [self responseData]); 

} 


-(void) connectionDidFinishLoading:(NSURLConnection*)connection 
{ 
    NSLog(@"I FINALLY received %@", [self responseData]); 

    NSXMLParser* parser = [[NSXMLParser alloc] initWithData:[self responseData]]; 
    [parser setDelegate:self]; 
    BOOL success = [parser parse]; 
    if (success) { 
     NSLog(@"XML parse success"); 
    }else { 
     NSLog(@"XML parse ERROR"); 
    } 

    [parser autorelease]; 

} 

の問題は、私は私がベースキャンプサーバから適切なXML応答を取得curlと同じURLにアクセスしようとするのに対し、responseDatanullデータを取得しても、右のURL、認証資格情報とヘッダフィールドを使用した後です。私は客観的なCには新しいです。この権利を得るために他に何を設定すべきか説明して教えてください。

+0

あなたは 'responseData'を開始しましたか? – Scar

+0

ya、responseDataを初期化しました。おかげでたくさん – Anand

+0

笑。私の友人、あなたが私のコメントがあなたを助けたと感じたら、投票してください:P – Scar

答えて

2

接続を開始する前に([connection start];)、プロパティresponseDataを初期化する必要があります(例:self.responseData = [[NSMutableData alloc] init];)。あなたがゼロにそのデータの長さを設定する必要があり- (void)connection:(NSURLConnection *)conn didReceiveResponse:(NSURLResponse *)response方法で

[self.responseData setLength:0];

+0

responseDataを初期化しました。さらに、なぜ私はその長さをゼロに設定すべきですか? – Anand

+0

このメソッドは複数回呼び出すことができるためです。前回のコール後にのみデータを保存する必要があります。 – Nekto

+2

@Anand:Nektoのコメントに加えて、複数の 'didReceiveResponse:'呼び出しを受け取るURLリダイレクトのようなものについては、いくつかのデータがあるかもしれませんが、これは以前のデータが受信されなかったので、実際に読み込まれる最終ページの一部です。 – darvids0n

1

[self responseData]を設定してもよろしいですか?

+0

ええ、私はこのコードでそれを追加します[[self responseData] appendData:data]; in didReceiveDataメソッド – Anand

+0

あなたはどこにコードを貼り付けることができますか? 例:[self setResponseData:[NSMutableData data]] –

0

ASIHTTPRequestと同じURLを試して、動作するかどうかを確認してください。

+0

ASIHTTPRequestは素晴らしいです。ちょうどそれをチェックアウト。いくつかのことは本当に簡単にできます。 – Anand

関連する問題