【问题标题】:AFNetworking with request error code 999AFNetworking 请求错误代码 999
【发布时间】:2016-01-13 18:17:03
【问题描述】:

我是 Objective-c 的新手,我在使用 AFNetworking 时遇到了困难。

所以问题是我想向服务器发出一个简单的 POST 请求,该服务器将向我发回盐。 我制作了一个简单的应用程序,以测试我的请求,但我不明白为什么会收到错误代码 999。

这是我的代码示例。

+ (void)simpleRequest; {
    NSURL *mailserver = [NSURL URLWithString:@"https://localhost:4443/"];

    AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc]initWithBaseURL:mailserver];
    manager.securityPolicy.allowInvalidCertificates = TRUE;
    manager.responseSerializer = [AFJSONResponseSerializer serializer];
    manager.requestSerializer = [AFJSONRequestSerializer serializer];
    NSDictionary *parameters = @{@"username": @"testtest"};

    [manager POST:@"api/v0/login/salt" parameters:parameters success:^(NSURLSessionDataTask *operation, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
    } failure:^(NSURLSessionDataTask *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
}

我已将此代码链接到调用此函数的简单按钮。

我有另一个应用程序,在 ruby​​ 运动中,使用此功能可以正常工作,我可以得到响应而没有任何错误。但是用这个简单的应用程序我不能做任何请求,他们都返回了这个错误代码 999。

错误:错误域=NSURLErrorDomain 代码=-999 “已取消” UserInfo={NSErrorFailingURLKey=https://localhost:4443/api/v0/login/salt, NSLocalizedDescription=取消, NSErrorFailingURLStringKey=https://localhost:4443/api/v0/login/salt}

所以我真的想知道我做错了什么,任何人都可以帮助我吗? 谢谢

编辑:

这是将经理保存在财产中的好方法还是我做错了什么? 如果这是好方法,这似乎行不通 感谢您的帮助

.h 文件

@property (nonatomic, retain) AFHTTPSessionManager *session;

.m 文件

@synthesize session;
- (IBAction)log:(id)sender {
NSURL *mailserver = [NSURL URLWithString:@"https://localhost:4443/"];

self.session = [[AFHTTPSessionManager alloc]initWithBaseURL:mailserver];
self.session.securityPolicy.allowInvalidCertificates = TRUE;
self.session.responseSerializer = [AFJSONResponseSerializer serializer];
self.session.requestSerializer = [AFJSONRequestSerializer serializer];
NSDictionary *parameters = @{@"username": @"testtest"};

[self.session POST:@"api/v0/login/salt" parameters:parameters success:^(NSURLSessionDataTask *operation, id responseObject) {
    NSLog(@"JSON: %@", responseObject);
} failure:^(NSURLSessionDataTask *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

【问题讨论】:

  • 这表明你的 URL 是错误的......也许应该将 localhost 转换为你的 IP 地址?
  • 有时参数会在请求正文中,而参数字段为零:比如https://localhost:4443/api/v0/login/salt?username=testtest
  • 我刚试了下还是不行,至少感谢帮助
  • 在我的情况下,它应该是像“localhost:4443/api/v0/login/salt”这样的请求,这在我的其他应用程序中可以正常工作
  • 我在 Google 中进行了一些搜索,他们说这是因为前一个请求尚未完成而另一个请求已发送,因此您收到 Canceled 错误

标签: ios objective-c afnetworking rubymotion


【解决方案1】:

[原来的 OP 问题可能没有提到 Cordova,但是在谷歌搜索这个问题时,这个链接在搜索结果中非常高]

对于我的 Cordova 项目(或类似项目),原来这是一个插件问题。确保您没有丢失任何插件,并确保它们已正确安装且没有问题。

验证这一点的最简单方法是通过重新创建 Cordova 项目 (cordova create <path>) 以及所需的平台 (cordova platform add <platform name>) 重新开始,并为每个插件添加详细标志 (- -verbose) 以便在下载插件、添加到项目并为每个平台安装时,您可以在控制台日志中查看是否有任何问题 (cordova plugin add cordova-plugin-device --verbose)

回顾: cordova create <path> cordova platform add <platform name> cordova plugin add cordova-plugin-device --verbose

【讨论】:

    【解决方案2】:

    在我的情况下,iOS 10 SDK 导致 AFNetworking 错误代码 -999。如果您尝试访问具有 SSL 的服务器并且您不想检查它,请在 Afnetworking 中添加一些隐私政策

    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
    securityPolicy.allowInvalidCertificates = YES;
    
    [securityPolicy setValidatesDomainName:NO];
    

    【讨论】:

    • 多一点上下文,比如在哪里分配这个安全策略,或者它是否是一个单例等等,会很有帮助。这个答案本身是不够的。
    • Fwiw,这个答案的前提是有用的——设置安全策略在会话管理器上确实有帮助(至少在我的情况下)。
    • _sessionManager = [[AFURLSessionManager alloc] initWithSessionConfiguration:_sessionConfiguration]; AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone]; securityPolicy.allowInvalidCertificates = YES; [securityPolicy setValidatesDomainName:NO]; _sessionManager.securityPolicy = securityPolicy;
    • 我收到一个关于 AFSSLPinningModeNone 模棱两可的错误(AFNetworking 3.1)(使用 [AFSecurityPolicy defaultPolicy] 解决了这个问题,它在内部调用了同样的东西)。
    • 这并不完全奏效,现在收到此警告:“为了验证自签名证书的域名,您必须使用 pinning”。
    【解决方案3】:

    我注意到您的 API 端点指示安全连接:

    httpS://localhost:4443/api/v0/login/salt

    只是以防万一,也许它会重复你的情况。

    在我的例子中,这是 API 管理器代码中的错字。从这部分可以说是与App Transport Security Settings有关。

    刚刚将受保护的协议从httpS:// 更改为http:// 并且错误:

    NSURLErrorDomain 代码 = -999 “已取消”

    消失了,一切正常

    +如果你有类似的问题。请务必与为您的应用程序处理服务器或 API 配置的后端专家讨论此问题。这意味着服务器没有有效的安全证书。也许您仍然需要安全连接。或者这个专家可以再次配置从http://httpS:// 的所有内容,我不确定(没有检查)在您已经使用非安全http:// 连接的代码中这是否会再次起作用。

    【讨论】:

      【解决方案4】:

      在我的例子中,iOS 9 SDK 的“App transport security”导致 AFNetworking 错误代码:-999。 如果您尝试访问没有 SSL 的服务器,请添加如下屏幕截图所示的密钥。

      【讨论】:

      • 这不应该是一个公认的答案了。从 iOS 10 开始,允许任意加载需要经过 Apple 的审核并获得特定许可。更好的答案是使用 ATS 允许通过异常加载到 HTTP 位置。查看此帖子stackoverflow.com/questions/31254725/…,了解此问题的真正解决方案。
      【解决方案5】:

      这是错误 -999,而不是 999。那是 NSURLErrorCancelled。您的请求在完成之前已被取消。

      查看您的代码,您不会在任何地方保留AFHTTPSessionManager *manager。这意味着一旦+simpleRequest 返回,经理将被处置。我猜这就是取消您的请求的原因。

      您需要保存管理器,以便它在整个请求期间都存在。将其保存在某处的属性中。

      【讨论】:

      • 我想我已经正确保存了经理,但仍然失败,我错过了什么吗?
      • @xikimay 那么这是因为拥有您的属性的实例在响应返回之前被取消初始化。例如,黑客可能是调用块内的经理(通过Log())。
      猜你喜欢
      • 1970-01-01
      • 2015-11-18
      • 2013-05-22
      • 2018-03-09
      • 1970-01-01
      • 2018-11-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多