web-dev-qa-db-fra.com

Erreur cacao 3840 à l'aide de JSON (iOS)

J'essaie d'envoyer des données à un serveur et de recevoir la réponse au format JSON. Le problème est que le serveur doit renvoyer "succès" ou "échouer" mais il renvoie "(null)".

Voici l'erreur renvoyée: 

Error Domain = NSCocoaErrorDomain Code = 3840 "L'opération n'a pas pu être complétée Terminée. (Erreur Cocoa 3840.)" (Le texte JSON n'a pas commencé avec array ou Object et l'option permettant d'autoriser les fragments non définis.) UserInfo = XXXXXXXXX {NSDebugDescription = Le texte JSON n'a pas commencé avec un tableau ou un objet et option pour autoriser les fragments non définis.}

Est-il possible que l'erreur soit dans le script du serveur?

Voici ma fonction pour envoyer les données et recevoir la réponse:

- (void) putData:(NSString *)parameter valor:(NSString *)valor {

    NSString *rawString = [NSString stringWithFormat:@"%@=%@", parameter, valor];
    NSData *data = [rawString dataUsingEncoding:NSUTF8StringEncoding];
    NSURL *url = [NSURL URLWithString:@"http://www.xxx.xxx/xxx.php"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    [request setHTTPMethod:@"PUT"];
    [request setHTTPBody:data];
    NSURLResponse *response;
    NSError *error;
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
    NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];
    NSLog(@"responseData: %@ error: %@", json, error);
}
38
iosdevrocks

Sauf si vous passez l'option NSJSONReadingAllowFragments à [NSJSONSerialization JSONObjectWithData:options:error:], la réponse du serveur doit être un JSON valide avec un conteneur de niveau supérieur qui est un tableau ou un dictionnaire. 

par exemple:

    { "response" : "Success" }

P.S . Si vous voulez un dictionnaire mutable, vous devez également inclure NSJSONReadingMutableContainers dans vos options.

34
Stu

Il se peut que la réponse de votre serveur ne contienne pas de code JSON valide.

Techniquement, l'objet JSON doit commencer par un "tableau" ou un "objet (dictionnaire)".

Ainsi, tout ce que votre serveur retourne ne l’est pas. 

De plus, vous pouvez forcer l'utilisation du code JSON indépendamment de l'utilisation de l'option NSJSONReadingAllowFragments.

en utilisant ,

AFJSONResponseSerializer *responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingAllowFragments];
9
Vandit Mehta

Vous pouvez obtenir ce problème si vous êtes connecté à un réseau privé virtuel sur votre appareil iOS. 

1
codeburn