2015-10-15 2 views
7

Я новичок в объектно-с, и мне сложно провести время с AFNetworking.AFNetworking с кодом ошибки запроса 999

Итак, я хочу сделать простой запрос POST на сервер, который пришлет мне соль. I'v сделать простое приложение, чтобы проверить мой запрос, но я не понимаю, почему я получаю код ошибки 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); 
    }]; 
} 

У меня есть ссылка на этот код на простую кнопку, которая вызывает эту функцию.

У меня есть другое приложение, в рубине, действие которого оштрафовано с помощью этой функции, я могу получить ответ без ошибок. Но с помощью этого простого приложения я не могу сделать любой запрос, все они вернулись этот код ошибки 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 }

Так что я на самом деле интересно, что я делаю неправильно, кто может помочь мне в этом? Благодаря

EDIT:

Это хороший способ для сохранения менеджера в собственности или я делаю что-то не так? Если это хороший способ, это, кажется, не работает Спасибо за помощь

.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); 
}]; 
+0

Он показывает, что ваш URL-адрес является ошибкой ... возможно, вам следует преобразовать localhost на ваш IP-адрес? – Tj3n

+0

И когда-нибудь парамы будут в теле запроса и это поле параметра равно nil: например [https: // localhost: 4443/api/v0/login/salt? Username = testtest] (https: // localhost: 4443/api/v0/login/salt? username = testtest) – Tj3n

+0

Я только что пробовал, но он не работает, по крайней мере, спасибо за помощь – xikimay

ответ

0

В моем случае "App транспортной безопасности" IOS 9 SDK, вызвать AFNetworking код ошибки: -999. Если вы пытаетесь связаться с сервером, который не имеет ключей для добавления SSL, например, снимок экрана ниже.

enter image description here

+0

Это не должно быть принятым ответом. Начиная с iOS 10, для разрешения произвольных нагрузок требуется обзор от Apple и конкретные разрешения на это. Лучшим ответом является использование ATS для загрузки нагрузок в местоположения HTTP с использованием исключений. Просмотрите это сообщение, https://stackoverflow.com/questions/31254725/transport-security-has-blocked-a-cleartext-http, для реального решения этой проблемы. – SamG

4

Это ошибка -999, а не 999. Это NSURLErrorCancelled. Ваш запрос был отменен до его завершения.

Рассматривая свой код, вы не сохраняете AFHTTPSessionManager *manager в любом месте. Это означает, что менеджер будет удален, как только вернется +simpleRequest. Я предполагаю, что это то, что отменяет ваш запрос.

Вам необходимо сохранить менеджера, чтобы он прожил на полную длительность вашего запроса. Сохраните его где-нибудь в собственности.

+0

Я думаю, что я правильно сохранил менеджера, но он все еще терпит неудачу, я что-то пропустил? – xikimay

+0

@xikimay, то это потому, что экземпляр, владеющий вашей собственностью, деинициализируется до того, как ответ вернется. Например, взлом может заключаться в вызове менеджера внутри блока (например, через «Log()»). – Nico

11

В моем случае IOS 10 причина SDK код с AFNetworking ошибки: -999. Если вы пытаетесь достичь сервера, имеют SSL и вы не хотите проверить его, добавить политику конфиденциальности, чтобы Afnetworking

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

[securityPolicy setValidatesDomainName:NO]; 
+0

Еще немного контекста, например, где назначить эту политику безопасности, или это синглтон и т. Д., Было бы полезно. Этого ответа само по себе недостаточно. – shortstuffsushi

+0

Fwiw, предпосылка этого ответа полезна - настройка политики безопасности на сеансе manger_ помогает (по крайней мере, в моем случае). – shortstuffsushi

+0

_sessionManager = [[AFURLSessionManager alloc] initWithSessionConfiguration: _sessionConfiguration]; AFSecurityPolicy * securityPolicy = [политика AFSecurityPolicyWithPinningMode: AFSSLPinningModeNone]; securityPolicy.allowInvalidCertificates = YES; [securityPolicy setValidatesDomainName: NO]; _sessionManager.securityPolicy = securityPolicy; – munibsiddiqui

0

Я заметил, что ваш API конечная точка указывает на безопасное соединение:

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

Просто попробуйте на всякий случай, возможно, это повторит вашу ситуацию.

В моем случае, это была типология в коде менеджера API. Который из части можно сказать, связан с настройками безопасности приложения Transport.

Просто изменил защищенный протокол от httpS:// к http:// и ошибки:

NSURLErrorDomain Code = -999 "cancelled"

ушел и все это работало!

+ А также, если у вас была аналогичная проблема. Обязательно сообщите об этом специалисту по основам, который занимается настройкой сервера или API для вашего приложения. Это означает, что сервер не имеет действительных сертификатов безопасности. Возможно, вам по-прежнему требуется безопасное соединение. Или этот специалист может снова сконфигурировать все с http:// до httpS://, и я не уверен (не проверял), будет ли это работать снова, когда в коде вы уже используете незащищенное соединение http://.