web-dev-qa-db-fra.com

Échec de la demande: type de contenu inacceptable: text/html avec AFNetworking 2.0

J'essaie la nouvelle version 2.0 d'AFNetworking et je reçois l'erreur ci-dessus. Une idée pourquoi cela se passe? Voici mon code:

    NSURL *URL = [NSURL URLWithString:kJSONlink];
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    AFHTTPRequestOperation *op = [[AFHTTPRequestOperation alloc] initWithRequest:request];
    op.responseSerializer = [AFJSONResponseSerializer serializer];
    [op setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"JSON: %@", responseObject);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
    [[NSOperationQueue mainQueue] addOperation:op];

J'utilise Xcode 5.0.

Aussi, voici le message d'erreur:

Error: Error Domain=AFNetworkingErrorDomain Code=-1016 "Request failed: unacceptable content-type: text/html" UserInfo=0xda2e670 {NSErrorFailingURLKey=kJSONlink, AFNetworkingOperationFailingURLResponseErrorKey=<NSHTTPURLResponse: 0xda35180> { URL: kJSONlink } { status code: 200, headers {
    Connection = "Keep-Alive";
    "Content-Encoding" = gzip;
    "Content-Length" = 2898;
    "Content-Type" = "text/html";
    Date = "Tue, 01 Oct 2013 10:59:45 GMT";
    "Keep-Alive" = "timeout=5, max=100";
    Server = Apache;
    Vary = "Accept-Encoding";
} }, NSLocalizedDescription=Request failed: unacceptable content-type: text/html}

Je viens de cacher le JSON en utilisant kJSONlink. Cela devrait renvoyer un JSON.

195
jaytrixz

Cela signifie que votre serveur envoie "text/html" au lieu des types déjà pris en charge . Ma solution consistait à ajouter "text/html" à acceptableContentTypes défini dans la classe AFURLResponseSerialization. Il suffit de rechercher "acceptableContentTypes" et d'ajouter @"text/html" à l'ensemble manuellement.

Bien sûr, la solution idéale consiste à modifier le type envoyé par le serveur, mais pour cela, vous devrez parler à l'équipe du serveur.

355
Andrei Neag

Définir mon RequestOperationManager Response Serializer sur HTTPResponseSerializer a résolu le problème.

Objectif c

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

Rapide

manager.responseSerializer = AFHTTPResponseSerializer()

Ce changement signifie que je n'ai pas besoin d'ajouter acceptableContentTypes à chaque demande que je fais.

177
Danpe

J'ai pris la réponse/commentaire de @ jaytrixz un peu plus loin et ajouté "text/html" à l'ensemble de types existant. Ainsi, quand ils le corrigeront du côté serveur à "application/json" ou "text/json", je prétends que cela fonctionnera de manière transparente.

  manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
70
mharper

Du côté du serveur, j'ai ajouté: 

header('Content-type: application/json');

dans mon code .php et cela a également résolu le problème.

32
Chris Prince

Je résous ce problème sous un angle différent. 

Je pense que si le serveur envoie des données JSON avec l'en-tête Content-Type: text/html. Cela ne signifie pas que le serveur a l'intention de vous envoyer du code HTML, mais il a été modifié accidentellement en JSON. Cela signifie que le serveur ne se soucie tout simplement pas de l'en-tête Content-Type. Donc, si le serveur ne s'en soucie pas du côté client, il vaut mieux ignorer également l'en-tête Content-Type. Pour ignorer l'en-tête Content-Type, vérifiez dans AFNetworking 

manager.responseSerializer.acceptableContentTypes = nil;

De cette manière, la variable AFJSONResponseSerializer (celle par défaut) sérialisera les données JSON sans vérifier Content-Type dans l'en-tête de la réponse.

17
dopcn

Un moyen simple d'activer la réception du type de contenu "text/plain":

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];

De même si vous souhaitez activer le type de contenu "text/html":

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
7
da Rocha Pires

J'ai essayé en dessous de la ligne selon @Andrie, mais ça n'a pas marché, 

op.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];

alors, après avoir chassé davantage, j’ai travaillé pour que cela fonctionne avec succès.

Voici mon code snip.

AFHTTPRequestOperationManager *operation = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:url];
    operation.responseSerializer = [AFJSONResponseSerializer serializer];

    AFJSONResponseSerializer *jsonResponseSerializer = [AFJSONResponseSerializer serializer];

    NSMutableSet *jsonAcceptableContentTypes = [NSMutableSet setWithSet:jsonResponseSerializer.acceptableContentTypes];
    [jsonAcceptableContentTypes addObject:@"text/plain"];
    jsonResponseSerializer.acceptableContentTypes = jsonAcceptableContentTypes;
    operation.responseSerializer = jsonResponseSerializer;

J'espère que cela aidera quelqu'un là-bas.

5
ABS

C’est la seule chose que j’ai trouvée fonctionner

-(void) testHTTPS {
    AFSecurityPolicy *securityPolicy = [[AFSecurityPolicy alloc] init];
    [securityPolicy setAllowInvalidCertificates:YES];

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    [manager setSecurityPolicy:securityPolicy];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    [manager GET:[NSString stringWithFormat:@"%@", Host] parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        NSLog(@"%@", string);
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"Error: %@", error);
    }];
}
3
chrisallick

Si quelqu'un utilise AFHTTPSessionManager, on peut faire comme ceci pour résoudre le problème,

Je sous-classe AFHTTPSessionManager où je fais comme ça,

NSMutableSet *contentTypes = [[NSMutableSet alloc] initWithSet:self.responseSerializer.acceptableContentTypes];
[contentTypes addObject:@"text/html"];
self.responseSerializer.acceptableContentTypes = contentTypes;
3
Hemang

Ajoutez simplement cette ligne:

operation.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
3
Elangovan

Dans mon cas, je ne contrôle pas les paramètres du serveur, mais je sais qu'il attend "application/json" pour "Content-Type". Je l'ai fait du côté client iOS:

manager.requestSerializer = [AFJSONRequestSerializer serializer];

se référer à Erreur de type de contenu AFNetworking version 2

2
uudaddy

Une bonne question a toujours plusieurs réponses, pour réduire et pour vous aider à choisir la bonne réponse, ici j'ajoute la mienne aussi. Je l'ai testé et cela fonctionne bien.

AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:@"http://www.yourdomain.com/appname/data/ws/index.php/user/login/"]];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];

[manager POST:@"POST" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSString *json = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
    NSLog(@"%@", json);
    //Now convert json string to dictionary.
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"%@", error.localizedDescription);
}];
0
Hemang

J'ai eu un problème similaire avec AFNetworking à partir d'une base de code Swift, alors je la laisse juste ici dans le cas distant, quelqu'un est aussi malchanceux que moi de travailler dans une telle configuration. Si tu l'es, je te sens mon pote, reste fort!

L'opération échouait à cause d'un "type de contenu inacceptable", malgré le fait que je définisse la variable acceptableContentTypes avec une variable Set contenant la valeur du type de contenu en question.

La solution pour moi était de modifier le code Swift pour qu'il soit plus convivial avec Objective-C, je suppose :

serializer.acceptableContentTypes = NSSet(array: ["application/xml", "text/xml", "text/plain"]) as Set<NSObject>
0
mokagio