AFJSONRequestOperation не работает (работает postpath)
Я пытаюсь опубликовать JSON с помощью AFNetworking.
Вот код, который я использую:
+ (RESTAPI *)sharedClient
{
static RESTAPI *_sharedClient = nil;
static dispatch_once_t oncePredicate;
dispatch_once(&oncePredicate, ^{
_sharedClient = [[self alloc] initWithBaseURL:[NSURL URLWithString:@"https://mybaseurl.com"]];
});
return _sharedClient;
}
- (id)initWithBaseURL:(NSURL *)url
{
self = [super initWithBaseURL:url];
if (!self) {
return nil;
}
[self setParameterEncoding:AFJSONParameterEncoding];
[self registerHTTPOperationClass:[AFJSONRequestOperation class]];
[self setDefaultHeader:@"Accept" value:@"application/json"];
[self setAllowsInvalidSSLCertificate:YES];
return self;
}
Следующий код не работает. Каждый раз, когда я пытаюсь, я получаю следующую ошибку:
Операция не может быть завершена. (NSURLErrorDomain ошибка -1012.)
// this code does not works
//
- (void)loginNOTWORKING
{
RESTAPI *client = [RESTAPI sharedClient];
[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];
[[AFNetworkActivityIndicatorManager sharedManager] incrementActivityCount];
NSDictionary *parameter = @{@"tgout": @"1",
@"tgin": @2,
@"username": @"foo",
@"password":@"bar"};
NSURLRequest *request = [client requestWithMethod:@"POST" path:@"/login" parameters:parameter];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
// code for successful return goes here
[[AFNetworkActivityIndicatorManager sharedManager] decrementActivityCount];
NSLog(@"THIS IS NEVER CALLED: %@", JSON);
// do something with return data
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
// code for failed request goes here
[[AFNetworkActivityIndicatorManager sharedManager] decrementActivityCount];
NSLog(@"SAD, VERY SAD: %@", error.localizedDescription);
// do something on failure
}];
[operation start];
}
Этот код работает:
// this code WORKS
- (void)loginWORKING
{
RESTAPI *client = [RESTAPI sharedClient];
[[AFNetworkActivityIndicatorManager sharedManager] setEnabled:YES];
[[AFNetworkActivityIndicatorManager sharedManager] incrementActivityCount];
NSDictionary *parameter = @{@"tgout": @"1",
@"tgin": @2,
@"username": @"foo",
@"password":@"bar"};
[client postPath:@"/login" parameters:parameter success:^(AFHTTPRequestOperation *operation, id responseObject) {
// Print the response body in text
NSLog(@"IT WORKS: %@",responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Response: %@", error.localizedDescription);
}];
}
Почему первый метод входа не работает? Что я делаю неправильно?
2 ответа
Попробуйте заменить
NSURLRequest *request = [client requestWithMethod:@"POST" path:@"/login" parameters:parameter];
с
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"/*HERE THE URL STRING TO CALL*/"]]
Вы можете найти ошибку -1012 в файле CFNetworkErrors.h
:
kCFURLErrorUserCancelledAuthentication = -1012
"The connection failed because the user cancelled required authentication."
Я думаю, есть проблема с вашей аутентификацией. Описание ошибки, возможно, вводит в заблуждение относительно "пользователя" - это фактически метод делегата, который вызывается, который отменяет аутентификацию, или аутентификация просто терпит неудачу.
Это, конечно, может быть вызвано неправильной сериализацией параметров. Я бы предложил использовать API более низкого уровня, создать запрос вручную, кодировать JSON вручную с помощью NSJSONSerialization
и установите данные тела и URL-адрес запроса. ИМХО, это, безусловно, более читаемый код, и, вероятно, требует меньше кода.