Httpsサーバーへの同期呼び出しを行う方法を誰かに教えてもらえますか?次のデリゲートメソッドを使用して、httpsサーバーで非同期リクエストを実行できます。
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
そして
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
しかし、同期を行う必要があります。
//リクエストのエンコード
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];
+ (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse **)response error:(NSError **)error
NSUrlConnection
はhttpsで正常に動作するはずです。
資格情報を提供する場合は、URLの一部である必要があります:(https://username:[email protected]/api/user.json
)。
NSURLConnection
デリゲートを提供する方法はないため、標準以外の認証処理が必要な場合は、非同期で行う必要があります。
それは私がそれをした方法です:代わりに
[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())にありました。将来的に他の誰かを助けることを願っています。