É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.
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.
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.
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"];
côté serveur, j'ai ajouté:
header('Content-type: application/json');
dans mon .php code et cela a aussi corrigé le problème.
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.
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"];
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.
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);
}];
}
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;
il suffit d'ajouter cette ligne:
operation.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
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
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>
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);
}];
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);
}];