ios - 使用 NSURL 发出 GET 请求不起作用

标签 ios

我正在尝试获取一个简单的 GET 请求来为我的 api 工作。但它似乎不起作用,我不确定为什么。

我的代码如下

编辑,也试过 NSURLCredential 但这似乎也不起作用

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    NSString *urlAsString = @"https://www.test.com/api/v1/user/logout/";
    NSURL *url = [NSURL URLWithString:urlAsString];
    NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url]; [urlRequest setTimeoutInterval:30.0f];
    [urlRequest setHTTPMethod:@"GET"];
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response,NSData *data, NSError *error) {
        if ([data length] >0 && error == nil){
            NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"HTML = %@", html); }
        else if ([data length] == 0 && error == nil){
            NSLog(@"Nothing was downloaded."); }
        else if (error != nil){
            NSLog(@"Error happened = %@", error); }
    }];

}

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
    return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
}

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
    [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];

    [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}

我的 API 输出 json。所以我应该得到一个 json 对象,上面写着

success: False
reason: 'Already Logged out'

但它给了我以下错误

2013-03-07 16:24:44.038 test[8957:1d03] Error happened = Error Domain=NSURLErrorDomain Code=-1012 "The operation couldn’t be completed. (NSURLErrorDomain error -1012.)" UserInfo=0x715db20 {NSErrorFailingURLKey=https://www.test.com/api/v1/user/logout/, NSErrorFailingURLStringKey=https://www.test.com/api/v1/user/logout/, NSUnderlyingError=0x7181cb0 "The operation couldn’t be completed. (kCFErrorDomainCFNetwork error -1012.)"}

方法二

经过一番研究,我发现了另一种发送get请求的方式,而且这种方式似乎工作正常

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        NSError *error = nil;
        NSURL *url = [NSURL URLWithString:@"https://www.test.com/api/v1/user/logout/"];
        NSString *json = [NSString stringWithContentsOfURL:url
                                                  encoding:NSASCIIStringEncoding
                                                     error:&error];
        if(!error) {
            NSData *jsonData = [json dataUsingEncoding:NSASCIIStringEncoding];
            NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:jsonData
                                                                     options:kNilOptions
                                                                       error:&error];
            BOOL success = [[jsonDict objectForKey:@"success"] boolValue];
            if (!success) {
                NSString *reason = [jsonDict objectForKey:@"reason"];
                NSLog(@"Cannot log out, as user %@", reason);
            }
            //NSLog(@"JSON: %@", jsonDict);
        }else{
            NSLog(@"\nJSON: %@ \n Error: %@", json, error);
        }
    });

最佳答案

问题的解决方案在于 API 本身。如果用户已经注销,API 应该发送 HTTPUnauthorized 信号。既然是这样,iOS 就会显示所有这些异常。当我放下它并发回一个简单的 json 响应时,一切都已修复。

关于ios - 使用 NSURL 发出 GET 请求不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15280479/

相关文章:

ios - UITableViewCell 在呈现时自动调整大小

ios - 在哪里快速设置委托(delegate)?

ios - 如何将打印字典转换为 NSDictionary?

ios - 从 UITextView 的第一行创建标题(Think Apple Notes 应用程序)Swift

ios - 桌面 View 到另一个 - IOS

ios - 对导航项的更改延迟显示

ios - 立即刷新 Firebase iOS SDK 缓存

iphone - 我实际上可以在不配置的情况下安装一些应用程序

ios - BarButtonItems 是如何添加到 NavigationBar 的?

iOS 如何将 USB 设备的特定 channel 设置为音频播放器? AV基金会