2013-11-09 5 views
6

Я пытаюсь вызвать api.php на моем локальном сервере (используя MAMP). на стороне сервера api.php вызывается, но содержание _POST внутри кода PHP содержит следующую ошибку:AFNetworking 2.0 Вопрос POST, ошибка Cocoa 3840 (текст JSON не начинался с массива ...)

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 я действительно отправляю.

спасибо.

+0

1) Что делает вас, что вы посылаете данные в формате JSON? (на самом деле, нет). 2) Что вы ожидаете от сервера? (возможно, не то, что вы ожидаете) 3) Где строка кода, которая вызывает ошибку? – CouchDeveloper

ответ

5

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

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

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

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

+0

Проблема в том, что я на самом деле пытался поставить _POST в сообщение об ошибке, но я просто жаловался на формат ошибки. Я сделал что-то вроде exitWithError (400, $ _POST); Я ошибочно думал, что я печатаю содержимое _POST. – user1097185

2

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

2

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

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]; 
      }]; 
Смежные вопросы