AFNetworking 2.0 POST issue, ошибка Cocoa 3840(текст JSON не начинался с массива…)

Я пытаюсь вызвать api.php на моем локальном сервере (с использованием MAMP). Серверному API.php вызывается, но содержимое _POST внутри кода php содержит следующую ошибку:

Error Domain = NSCocoaErrorDomain Code = 3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) UserInfo = 0x15d7bdd0 {NSDebugDescription = JSON text did not start with array or object and option to allow fragments not set.}

мое приложение, которое пытается отправить запрос JSON POST в api.php-это приложение iOS, использующее AFNetworking 2

Это мой код:

- (void)postUpdateRequest
{
    if (!dataModel)
        dataModel = [[DataModel alloc] init];

    NSDictionary *params = @{@"foo": @"bar2"};

    NSLog(@"%@",params);

/*    NSDictionary *params = @{@"cmd":@"update",
                             @"user_id":[dataModel userId],
                             @"token":[dataModel deviceToken]
                             };//@"ip_address":[dataModel getIPAddress]};*/

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//    manager.requestSerializer = [AFJSONRequestSerializer serializer];

    [manager POST:ServerApiURL parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
}

Я посмотрел по всему интернету, но не могу найти ответ на мою конкретную проблему. Неважно, что я делаю я получаю та же ошибка обратно.

почему мой JSON неправильно отформатирован? Я также не могу найти способ понюхать, что JSON я на самом деле посылаю.

спасибо.

3 ответов


когда вы используете API, как в вашем примере, ваше HTTP-сообщение будет составлено с помощью Content-Type application/x-www-form-urlencoded. Внутренне, ваш param словарь кодируются AFN (хотя и не строго корректно, как указано w3c) и устанавливаются в качестве тела запроса.

Так как вы не указали Accept заголовок, сервер может выбрать тип контента для возможных данных ответа (если таковые имеются).

когда вы получаете ответ, вам нужно всегда Регистрация Код состояния HTTP и тип содержимого тела ответа (если есть).

вероятно, сервер вернул код состояния, указывающий на некоторую проблему, и тело ответа, содержащее "ответ об ошибке" в каком-то другом типе контента, чем вы ожидаете (например, он вернул text/html).


вы можете использовать smth как wireshark (http://www.wireshark.org/) при запуске приложения в симуляторе или на устройстве, подключенном через общий wifi к mac, вы запускаете whireshark для отслеживания фактических запросов и ответов.


это работает для меня:

 AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    AFJSONRequestSerializer *requestSerializer = [AFJSONRequestSerializer serializer];

 [requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    manager.requestSerializer = requestSerializer;

[manager POST:URLString
       parameters:params
          success:^(AFHTTPRequestOperation *operation, id responseObject) {
              NSLog(@"JSON: %@", responseObject);
              [MBProgressHUD hideAllHUDsForView:self.view animated:YES];
          } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
              NSLog(@"Error: %@", error);
              [MBProgressHUD hideAllHUDsForView:self.view animated:YES];
          }];