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-адрес запроса. ИМХО, это, безусловно, более читаемый код, и, вероятно, требует меньше кода.

Другие вопросы по тегам