私は現在、一部のサーバーAPI呼び出しでhttpからhttpsに切り替えようとしていますが、私は自分自身に説明できない問題があります。NSURLConnection sendAsynchronousRequest:httpsで長時間実行
httpからhttpsに切り替わった直後に、サーバーがすでに要求を処理していたにもかかわらず、私の非同期要求が完了するまでに60秒かかることがあります。
エラーはスローされず、タイムアウトも発生しません。要求が完了したことを通知するのに60秒かかることがあります。それから、60秒後、それはそれが意味することだけを行います。
これは私がやっているものです:
NSString *theBody = @"param1=value1¶m2=value2";
NSData *bodyData = [theBody dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSURL *url = [NSURL URLWithString:@"https://my.api.server.com/call"];
NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] initWithURL:url] autorelease];
[request setValue:@"My User-Agent" forHTTPHeaderField:@"User-Agent"];
// Tested this one, too. Yes, I did set to utf8 encoding when trying this
// [request setValue:@"application/x-www-form-urlencoded charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:bodyData];
// testing only
// [request setTimeoutInterval:15];
[NSURLConnection sendAsynchronousRequest:request
queue:[NSOperationQueue mainQueue]
completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
NSLog(@"Finished!");
}];
ログメッセージは60秒後にスローされます。ログメッセージが出力される前に対応するデータをリフレッシュすると、すべてが既に発生していることがわかります。リフレッシュされたデータを正しく引き出すことができます。
私はすでに私のサーバーが応答時間が長くかかると思っていましたが、私はRubyを使って同じリクエストを試してみました。
ここで何が起こっているのでしょうか?事前に
おかげ
アルネ
別のサーバーに投稿するとどうなりますか?ちょうどテストのために? httpsでグーグルに投稿するか...あなたのサーバーには誤動作があると思います。 –
あなたは正しいかもしれません。しかし、面白い事実があります:要求が成功しなかったら、それは機能します。少なくとも60秒かかるとは限りませんが、すぐに戻ります。 サーバー上でJSON応答を返します。呼び出しが成功すると、オブジェクトのコード201(エンティティが作成されました)とJSONが戻されます。成功しない場合は、コード4xxおよびJSONとエラーメッセージが返されます。エラーはすぐに機能し、成功するとNSURLConnectionは60秒かかって終了しますが、この時間が経過すると正常終了します。 – arnekolja
私はちょうどブロックの代わりに委譲を使ってみました、そして、私はこれを今働いています。しかし、一体どのようにこれは可能ですか? iOS 5.1のバグで、201がレスポンスコードとして認識されないのですか?それを説明することはできません...任意のアイデア? – arnekolja