请求错误代码为 999 的 AFNetworking

AFNetworking with request error code 999

我是 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);
    }];
}

我已将 link 这段代码发送到调用此函数的简单按钮。

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

Error: Error Domain=NSURLErrorDomain Code=-999 "cancelled" UserInfo={NSErrorFailingURLKey=https://localhost:4443/api/v0/login/salt, NSLocalizedDescription=cancelled, NSErrorFailingURLStringKey=https://localhost:4443/api/v0/login/salt}

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

编辑:

这是在 属性 中拯救经理的好方法还是我做错了什么? 如果这是好方法,这似乎行不通 感谢帮助

.h file

@property (nonatomic, retain) AFHTTPSessionManager *session;

.m file

@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);
}];

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

查看您的代码,您没有在任何地方保留 AFHTTPSessionManager *manager。这意味着经理将在 +simpleRequest returns 后立即被处置。我猜这就是取消您的请求的原因。

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

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

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

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

[securityPolicy setValidatesDomainName:NO];

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

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

试试以防万一,说不定又重复你的情况

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

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

NSURLErrorDomain Code = -999 "cancelled"

消失了,一切正常

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

[原来的 OP 问题可能没有提到 Cordova,但是这个 link 在谷歌搜索这个问题时在搜索结果中的排名很高]

对于我的 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