web-dev-qa-db-ja.com

httpsでのNSURLConnection同期リクエスト

Httpsサーバーへの同期呼び出しを行う方法を誰かに教えてもらえますか?次のデリゲートメソッドを使用して、httpsサーバーで非同期リクエストを実行できます。

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace

そして

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge

しかし、同期を行う必要があります。

19
Anis

//リクエストのエンコード

NSData *postData = [xmlText dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];

**//Calculating length of request**
NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:requestUrlString]];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/xml" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];
NSURLResponse* response;
NSError* error = nil;

//Capturing server response
NSData* result = [NSURLConnection sendSynchronousRequest:request  returningResponse:&response error:&error];
24
Snehal
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error

NSUrlConnectionはhttpsで正常に動作するはずです。

資格情報を提供する場合は、URLの一部である必要があります:(https://username:[email protected]/api/user.json)。

NSURLConnectionデリゲートを提供する方法はないため、標準以外の認証処理が必要な場合は、非同期で行う必要があります。

13
anq

それは私がそれをした方法です:代わりに

[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]

デリゲートが必要になるため、包含クラスに基づいて同じメソッドインスタンスを作成しました。また、シングルトンにしないでください。すべての接続に独立した変数があります。そうしないと、2つの接続が終了する前に2つの接続が呼び出されると、受信データとループの処理が回復不能に絡み合ってしまいます。 。

[[ClassNameHere new] sendSynchronousRequest:request returningResponse:&response error:&error]

このようにして、NSUrl接続を作成し、それを処理することができます(同期的に、方法を確認します)。これにより、以前に記述したコードを変更する必要がありません。

- (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse *__strong*)response error:(NSError *__strong*)error
{
    _finishedLoading=NO;
    _receivedData=[NSMutableData new];
    _error=error;
    _response=response;

    NSURLConnection*con=[NSURLConnection connectionWithRequest:request delegate:self];
    [con start];
    CFRunLoopRun();

    return _receivedData;
}


- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
    return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{
    //handle the challenge
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    *_response=response;
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [_receivedData appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    *_error=error;
    CFRunLoopStop(CFRunLoopGetCurrent());
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    CFRunLoopStop(CFRunLoopGetCurrent());
}

コツはCFRunLoopRun()とCFRunLoopStop(CFRunLoopGetCurrent())にありました。将来的に他の誰かを助けることを願っています。

6
LolaRun