2013-11-09 9 views
6

Sto tentando di chiamare api.php sul mio server locale (usando MAMP). L'api.php lato server viene chiamato, ma il contenuto del _POST all'interno del codice php contiene il seguente errore:AFNetworking 2.0 POST issue, cacao errore 3840 (testo JSON non iniziato con array ...)

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.} 

mia app che sta tentando di inviare la richiesta JSON POST al api.php è un iOS applicazione utilizzando AFNetworking 2

Questo è il mio codice di richiesta:

- (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); 
    }]; 
} 

ho cercato su internet, ma non riesce a trovare una risposta per il mio problema specifico. Non importa quello che faccio Ricomincio lo stesso errore.

Perché il mio JSON non è stato formattato correttamente? Inoltre, non riesco a trovare un modo per annusare ciò che JSON sto effettivamente inviando.

Grazie.

+0

1) Che cosa ti fa sicuri di inviare dati JSON? (in realtà, non lo fai). 2) Cosa ti aspetti che il server ritorni? (probabilmente non è quello che ti aspetti) 3) Dov'è la riga di codice che causa l'errore? – CouchDeveloper

risposta

5

Quando si utilizza l'API come nell'esempio, il messaggio HTTP verrà composto utilizzando un Content-Type application/x-www-form-urlencoded. Internamente, il tuo dizionario param viene codificato da AFN (sebbene non sia strettamente corretto come specificato da w3c) e impostato come corpo della richiesta.

Poiché non è stata specificata un'intestazione Accept, il server è libero di scegliere il tipo di contenuto per eventuali dati di risposta (se presenti).

Quando si riceve una risposta, è necessario sempre controllare il codice di stato HTTP e il tipo di contenuto di un corpo di risposta (se presente).

È probabile che il server abbia restituito un codice di stato che indica alcuni problemi e un corpo di risposta contenente una "risposta di errore" in un tipo di contenuto diverso da quello previsto (ad esempio, ha restituito testo/html).

+0

Il problema era che stavo effettivamente provando a inserire _POST nel messaggio di errore, ma mi sono lamentato solo del formato dell'errore, penso. Ho fatto qualcosa come exitWithError (400, $ _POST); Ho erroneamente pensato di stampare il contenuto _POST. – user1097185

2

È possibile utilizzare smth come wireshark (http://www.wireshark.org/) durante l'esecuzione dell'app nel simulatore o sul dispositivo collegato tramite Wi-Fi condiviso a Mac su cui si esegue il whirehark per tracciare le richieste e le risposte effettive.

2

questo funziona per me:

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]; 
      }]; 
Problemi correlati