次のようなリクエストを送信する同期メソッドがあります。
+ (NSString *)sendRequest:(NSMutableURLRequest *)request {
NSHTTPURLResponse *response;
NSError *error;
NSData *responseData =
[NSURLConnection sendSynchronousRequest:request
returningResponse:&response
error:&error];
NSLog(@"response = %@", response);
NSLog(@"error = %@", [error localizedDescription]);
NSString *responseString =
[[NSString alloc] initWithData:responseData
encoding:NSUTF8StringEncoding];
[responseString autorelease];
NSLog(@"%@: %@", [request HTTPMethod], [request URL]);
NSLog(@"Response Code: %d", [response statusCode]);
NSLog(@"Content-Type: %@", [[response allHeaderFields]
objectForKey:@"Content-Type"]);
NSLog(@"Response: %@\n\n", responseString);
return responseString;
}
特定のリクエストについて、「操作を完了できませんでした。(NSURLErrorDomain エラー -1012。)」というエラーを含む null 応答が返されます。
Foundation 定数リファレンスによると、このコードは NSURLErrorUserCancelledAuthentication であり、次のように記述されています。
認証の非同期リクエストがユーザーによってキャンセルされたときに返されます。
これは通常、ユーザーが認証を試みるのではなく、ユーザー名/パスワード ダイアログで [キャンセル] ボタンをクリックした場合に発生します。
ただし、キャンセルをクリックするユーザーはいません。承認されずにイベントのリストを取得するリクエストを作成しているだけなので、返される 401 は、NSURLErrorUserCancelledAuthentication エラーによる null 応答ではなく、未承認の応答を生成するはずです。この応答を返す私の Rails コードは次のとおりです。
def require_auth
# Return unauthorized if the API call was not made by an authorized user
unless current_user
respond_to do |format|
#format.json { render :text => "Unauthorized", :status => :unauthorized }
format.json { head :unauthorized }
format.xml { head :unauthorized }
end
end
end
私の Rails ログからの出力は次のようになります。
Started GET "/events.json" for
127.0.0.1 at Fri Jan 07 10:51:47 -0500 2011
Processing by EventsController#index as JSON Completed 401 Unauthorized in 0ms
なぜこれが起こっているのか、正しい応答を作成する方法を知っている人はいますか?