我有一个同步方法来发送如下所示的请求:
+ (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
有谁知道为什么会这样,以及如何创建正确的回复?
答案 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