Я пытаюсь вызвать 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 я действительно отправляю.
Спасибо.
Когда вы используете API, как в вашем примере, ваше HTTP-сообщение будет составлено с помощью приложения Content-Type application/x-www-form-urlencoded
. Внутри ваш словарь параметров закодирован AFN (хотя и не совсем корректным, как указано w3c), и устанавливается как тело запроса.
Поскольку вы не указали заголовок Accept
, сервер может выбрать тип контента для возможных ответов (если есть).
Когда вы получаете ответ, вам нужно всегда проверять код состояния HTTP и тип содержимого тела ответа (если есть).
Вероятно, сервер вернул код состояния, указывающий на какую-то проблему, и тело ответа, содержащее «ответ об ошибке» в виде определенного типа контента, который вы ожидаете (например, он вернул текст / html).
Вы можете использовать smth like 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]; }];