iOS 无法执行 HTTP GET 请求 - 错误域 = NSURLErrorDomain Code=-1012

15

我想执行HTTP Get请求,但一直出现错误:Error Domain=NSURLErrorDomain Code=-1012。以下是我的代码:

@try {
    NSString *url = [[NSString alloc] initWithFormat:@"%@%@", @"http://api.mintchat.com/agent/chats/", agentSecret];

    NSLog(@"******Agents Active List URL Str - %@", url);
    NSURL *nsUrl = [NSURL URLWithString:url];  
    NSLog(@"******Agents Active List URL - %@", nsUrl);

   // Make the request, returning a JSON response, just as a plain old string.
   //NSData *jsonDataString = [[NSString stringWithContentsOfURL:[NSURL URLWithString:url] encoding:NSUTF8StringEncoding error: nil] dataUsingEncoding:NSUTF8StringEncoding];

    NSError *error = nil;

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:nsUrl];
    [request setHTTPMethod:@"GET"];
    [request setValue:API_ID forHTTPHeaderField:@"X-API-ID"];
    [request setValue:API_SECRET forHTTPHeaderField:@"X­-API-­SECRET"];

    NSHTTPURLResponse *response = nil;
    NSData *urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

    NSLog(@"Response Code %d", [response statusCode]);
    if ([response statusCode] >= 200 && [response statusCode] < 300) {
        NSString *responseData = [ [NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];
       NSLog(@"Response  ==> %@", responseData);        
    } else {
       if (error)
          NSLog(@"ERror : %@", error);
    }
}@catch(NSException *e) {
        NSLog(@"Exception - %@", e);
   }

我需要用JSON获取响应,但由于某些原因不起作用,我们正在尝试使用一些普通的响应。我确认需要将标头添加到请求中。我需要将这两个值都添加到标头中。URL也是正确的。
我得到的结果/日志是: 响应代码0
错误:错误域=NSURLErrorDomain Code=-1012,“无法完成操作。(NSURLErrorDomain error -1012.)”UserInfo=0x8abf470 { NSErrorFailingURLKey=.......NSErrorFailingURLStringKey=......NSUnderlyingError=0x8dafed0 “无法完成操作。(kCFErrorDomainCFNetwork error -1012.)” }
我还在网上搜索了很多关于此错误的信息,但没有得到任何实质性的帮助。我还确认了对Web服务器API的访问权限。对于其他URL,我也得到了相同的结果。从3个URL中,我可以使用POST获得第一个URL的结果,但是那另外2个URL-无法通过它。
是否有人能够帮助我解决这个问题?我错在哪里?为什么无法访问API? 非常感谢您的任何帮助。

可能是 https://dev59.com/JnbZa4cB1Zd3GeqPBQ55 的重复问题。 - user2289379
2
未来的访客请注意:这并不是一个重复内容。 - Mike Caron
5个回答

38
你可能在使用AFNetworking访问一个HTTPS URL(不是HTTP),并碰到了一个坏的/过期的证书而出现错误(当访问该URL时,Chrome会显示“您的连接不是私密连接”的消息)。

好的,这是一个正确的答案。但是对于状态码0该怎么办? - fnc12

10

这个错误是NSURLErrorUserCancelledAuthentication

当用户取消异步身份验证请求时返回。通常是在用户名/密码对话框中点击“取消”按钮导致的,而不是用户尝试进行身份验证。

这意味着您需要经过身份验证才能访问您未正确签署请求的资源(错误的agentSecret或API_ID或API_SECRET)。


从您的错误中找到了解决方案。需要使用NSURLRequest而不是NSMutableRequest,因此将标头添加到mutRequest并将其复制到请求中。原始问题在于,在标头字段中,X-API-SECRET中的“ - ”被替换为unicode值通过请求发送,因此它不被验证并且失败了。将这些标头键和值添加到实例变量中,更正请求因素,因此能够成功访问API。谢谢。 - Tvd

4

对于我的情况,我只需将afnetworking http客户端的以下标志设置为Yes。allowsInvalidSSLCertificate = YES,它就可以正常处理https get请求。


我这里有类似的情况。在我切换不使用HTTPS后,它可以正常工作。 - chubao
这是正确的,如果您使用HTTP而不是HTTPS,但实际上我们需要一个有效的自签名证书,并且需要设置HTTPClient.defaultSSLPinningMode = AFSSLPinningModePublicKey; - jatin

2
如果有帮助的话,当服务器发送一个 401(未经授权)状态码时,您将会收到此错误。

0
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>localhost</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

只需将这些行粘贴到信息列表中


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接