无法从iPhone应用程序获得401响应(未经授权)

时间:2011-01-07 16:16:12

标签: iphone ruby-on-rails unauthorized nsurlerrordomain

我有一个同步方法来发送如下所示的请求:

+ (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 error -1012。)”

根据Foundation constants reference,这段代码是NSURLErrorUserCancelledAuthentication,描述为

  

异步请求时返回   用于身份验证被取消   用户。

     

这通常是通过点击产生的   一个“取消”按钮   用户名/密码对话框,而不是   用户尝试   认证

但是,我没有用户点击取消。我只是在没有被授权的情况下发出检索事件列表的请求,因此我返回的401应该产生未经授权的响应,而不是带有NSURLErrorUserCancelledAuthentication错误的空响应。我的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

有谁知道为什么会这样,以及如何创建正确的回复?

1 个答案:

答案 0 :(得分:1)

我更像是一个Rails人而不是iPhone人,但快速谷歌搜索(请参见此处的帖子:http://discussions.apple.com/thread.jspa?messageID=7915337)NSURLConnection仅在成功(200)时返回NSHTTPURLResponse,否则返回null响应和你在401上看到的行为。

看起来这是API的本质,如果你想区分不同的非200状态响应,你需要使用较低级别的东西。

这个其他Stackoverflow线程似乎意味着API的异步版本将允许您获取所有响应代码和数据:iOS: How can i receive HTTP 401 instead of -1012 NSURLErrorUserCancelledAuthentication