2

次のようなリクエストを送信する同期メソッドがあります。

+ (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

なぜこれが起こっているのか、正しい応答を作成する方法を知っている人はいますか?

4

1 に答える 1

1

私は iPhone 派というよりは Rails 派ですが、簡単にググってみると (こちらのスレッドを参照してください: http://discussions.apple.com/thread.jspa?messageID=7915337 )、NSURLConnection は成功した場合にのみ NSHTTPURLResponse を返す (200 ) それ以外の場合は、null 応答と 401 で見られる動作を返します。

これは API の性質のようで、200 以外のさまざまなステータス レスポンスを区別したい場合は、より低いレベルのものを使用する必要があります。

この他の Stackoverflow スレッドは、非同期バージョンの API を使用すると、すべての応答コードとデータを取得できることを暗示しているようです: iOS: How can i receive HTTP 401 instead of -1012 NSURLErrorUserCancelledAuthentication

于 2011-02-21T19:05:57.547 に答える