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

j'essaie la nouvelle version 2.0 de AFNetworking et j'obtiens l'erreur ci-dessus. Une idée de pourquoi ce qui 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. Ça devrait rapporter un JSON.

193
demandé sur halfer 2013-10-01 15:09:16

14 réponses

cela signifie que votre serveur envoie "text/html" au lieu des types déjà supportés. Ma solution était d'ajouter "text/html" à acceptableContentTypes dans la classe AFURLResponseSerialization . Il suffit de rechercher "acceptableContentTypes" et d'ajouter @"text/html" à l'ensemble manuellement.

bien sûr, la solution idéale est de changer le type envoyé depuis le serveur, mais pour cela vous devrez parler avec l'équipe du serveur.

354
répondu Andrei Neag 2015-05-07 18:54:30

paramétrant mon sérialiseur de réponse RequestOperationManager à HTTPResponseSerializer a réglé le problème.

Objectif-C

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

Swift

manager.responseSerializer = AFHTTPResponseSerializer()

ce changement signifie que je n'ai pas besoin d'ajouter acceptableContentTypes à chaque demande que je présente.

174
répondu Danpe 2015-10-31 12:56:03

j'ai pris la réponse/commentaire de @jaytrixz une étape plus loin et j'ai ajouté" text/html " à l'ensemble existant de types. De cette façon, quand ils le fixeront du côté du serveur à "application/json" ou "text/JSON", je prétends que cela fonctionnera parfaitement.

  manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
70
répondu mharper 2014-02-15 22:54:36

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

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

dans mon .php code et cela a aussi corrigé le problème.

31
répondu Chris Prince 2013-10-10 19:01:27

Je résous ce problème d'un point de vue 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 type du serveur avait l'intention de vous envoyer du html mais qu'il a accidentellement changé pour JSON. Cela signifie que le type du serveur ne se soucie tout simplement pas de ce qu'est l'en-tête Content-Type . Donc si le type du serveur ne s'en soucie pas du côté client, vous feriez mieux d'ignorer l'en-tête Content-Type . Pour ignorer l'enregistrement de l'en-tête Content-Type AFNetworking

manager.responseSerializer.acceptableContentTypes = nil;

de cette façon le AFJSONResponseSerializer (celui par défaut) sérialisera les données JSON sans cocher Content-Type dans l'en-tête de réponse.

17
répondu dopcn 2015-01-27 03:44:41

une façon simple de permettre de recevoir le 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"];
6
répondu da Rocha Pires 2014-12-06 07:38:58

j'ai essayé en dessous de la ligne comme @Andrie réponse mais n'a pas fonctionné,

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

donc après avoir chassé plus, j'ai travaillé autour pour obtenir le travail 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;

Espérons que cela aidera quelqu'un là-bas.

5
répondu ABS 2015-07-09 11:58:00

C'est la seule chose que j'ai trouvé à travailler

-(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
répondu chrisallick 2014-08-22 19:36:20

si quelqu'un utilise AFHTTPSessionManager alors on peut faire comme ça pour résoudre le problème,

je sous-classé AFHTTPSessionManager où je fais comme ça", 151940920"

NSMutableSet *contentTypes = [[NSMutableSet alloc] initWithSet:self.responseSerializer.acceptableContentTypes];
[contentTypes addObject:@"text/html"];
self.responseSerializer.acceptableContentTypes = contentTypes;
3
répondu Hemang 2014-09-30 11:42:28

il suffit d'ajouter cette ligne:

operation.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
3
répondu Elangovan 2015-07-02 10:18:22

dans mon cas, je n'ai pas le contrôle sur le réglage du serveur, mais je sais qu'il attend" application/json "pour"Content-Type". Je l'ai fait sur l'iOS côté client:

manager.requestSerializer = [AFJSONRequestSerializer serializer];

se référer à AFNetworking version 2 contenu-type d'erreur

2
répondu uudaddy 2017-05-23 12:10:54

j'ai eu un problème similaire en travaillant avec AFNetworking à partir d'une base de code Swift, donc je laisse ça ici dans le cas de la télécommande quelqu'un est aussi malchanceux que moi d'avoir à travailler dans une telle configuration. si tu l'es, je te sens mon pote, reste fort!

l'opération échouait en raison de" Content-type inacceptable", malgré le fait que j'ai placé le acceptableContentTypes avec un 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 objectif-c amical, je suppose :

serializer.acceptableContentTypes = NSSet(array: ["application/xml", "text/xml", "text/plain"]) as Set<NSObject>
0
répondu mokagio 2016-05-16 01:56:38

une bonne question ont toujours des réponses multiples, pour réduire et vous aider à choisir la bonne réponse, ici je suis ajouter le mien aussi. Je l'ai testé et il fonctionne très 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
répondu Hemang 2016-07-13 06:02:22
 UIImage *image = [UIImage imageNamed:@"decline_clicked.png"];
NSData *imageData = UIImageJPEGRepresentation(image,1);


NSString *queryStringss = [NSString stringWithFormat:@"http://119.9.77.121/lets_chat/index.php/webservices/uploadfile/"];
queryStringss = [queryStringss stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];

[MBProgressHUD showHUDAddedTo:self.view animated:YES];


[manager POST:queryStringss parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
 {


     [formData appendPartWithFileData:imageData name:@"fileName" fileName:@"decline_clicked.png" mimeType:@"image/jpeg"];



 }
      success:^(AFHTTPRequestOperation *operation, id responseObject)
 {



    NSDictionary *dict = [responseObject objectForKey:@"Result"];

    NSLog(@"Success: %@ ***** %@", operation.responseString, responseObject);
    [MBProgressHUD hideAllHUDsForView:self.view animated:YES];


 }
      failure:^(AFHTTPRequestOperation *operation, NSError *error)
 {
     [MBProgressHUD hideAllHUDsForView:self.view animated:YES];
     NSLog(@"Error: %@ ***** %@", operation.responseString, error);
 }];
-1
répondu Spydy 2014-08-18 06:47:44