Solicitud fallida: tipo de contenido inaceptable: texto / html utilizando AFNetworking 2.0

Estoy probando la nueva versión 2.0 de AFNetworking y recibo el error anterior. ¿Alguna idea de por qué está pasando esto? Aquí está mi código:

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]; 

Estoy usando Xcode 5.0.

Además, aquí está el mensaje de error:

 Error: Error Domain=AFNetworkingErrorDomain Code=-1016 "Request failed: unacceptable content-type: text/html" UserInfo=0xda2e670 {NSErrorFailingURLKey=kJSONlink, AFNetworkingOperationFailingURLResponseErrorKey= { 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} 

Simplemente escondí el JSON usando kJSONlink. Esto debería devolver un JSON.

Esto significa que su servidor está enviando "text/html" lugar de los tipos ya admitidos. Mi solución fue agregar "text/html" a acceptableContentTypes AFURLResponseSerialization acceptableContentTypes establecidos en la clase AFURLResponseSerialization . Simplemente busque “acceptableContentTypes” y agregue @"text/html" al conjunto manualmente.

Por supuesto, la solución ideal es cambiar el tipo enviado desde el servidor, pero para eso tendrá que hablar con el equipo del servidor.

Configurar mi RequestOperationManager Respuesta RequestOperationManager a HTTPResponseSerializer solucionó el problema.

C objective

 manager.responseSerializer = [AFHTTPResponseSerializer serializer]; 

Rápido

 manager.responseSerializer = AFHTTPResponseSerializer() 

Hacer este cambio significa que no necesito agregar acceptableContentTypes de contenido acceptableContentTypes a cada solicitud que hago.

Tomé la respuesta / comentario de @jaytrixz un paso más allá y agregué “texto / html” al conjunto existente de tipos. De esa manera, cuando lo arreglen en el lado del servidor para “application / json” o “text / json”, afirmo que funcionará perfectamente.

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

En el lado del servidor, agregué:

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

en mi código .php y esto también solucionó el problema.

Resuelvo este problema desde una perspectiva diferente.

Creo que si el servidor envía datos JSON con Content-Type: text/html header. No significa que el tipo servidor quería enviarle algo de HTML, pero cambió accidentalmente a JSON. Significa que al tipo servidor no le importa qué es el encabezado Content-Type . Entonces, si al tipo servidor no le importa el lado del cliente, es mejor que también ignore el encabezado Content-Type . Para ignorar la comprobación del encabezado Content-Type en AFNetworking

 manager.responseSerializer.acceptableContentTypes = nil; 

De esta forma, AFJSONResponseSerializer (el predeterminado) serializará los datos JSON sin verificar Content-Type en el encabezado de respuesta.

Una forma sencilla de habilitar para recibir el tipo de contenido “text / plain”:

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

Del mismo modo, si desea habilitar el tipo de contenido “text / html”:

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

Intenté debajo de la línea según la respuesta de @Andrie pero no funcionó,

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

así que después de cazar más, trabajé para que funcione correctamente.

Aquí está mi fragmento de código.

 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; 

Espero que esto ayude a alguien por ahí.

Esto es lo único que encontré para trabajar

 -(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 alguien está usando AFHTTPSessionManager entonces uno puede hacer esto para resolver el problema,

AFHTTPSessionManager donde estoy haciendo esto,

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

Solo agregue esta línea:

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

En mi caso, no tengo control sobre la configuración del servidor, pero sé que está esperando “application / json” para “Content-Type”. Lo hice en el lado del cliente de iOS:

 manager.requestSerializer = [AFJSONRequestSerializer serializer]; 

consulte el error de tipo de contenido AFNetworking versión 2

De alguna manera, tuve un problema similar al trabajar con AFNetworking desde una base de código de Swift, así que lo dejo aquí en el caso remoto, alguien tiene la mala suerte de tener que trabajar en esa configuración. Si es así, siento que amigo, ¡mantente fuerte!

La operación estaba fallando debido a un “tipo de contenido inaceptable”, a pesar de que realmente establezco los acceptableContentTypes contenido acceptableContentTypes con un Set contiene el valor de tipo de contenido en cuestión.

La solución para mí fue modificar el código de Swift para que sea más amigable para Objective-C, supongo :

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

Una buena pregunta siempre tiene múltiples respuestas, para reducir y ayudarlo a elegir la respuesta correcta, aquí también estoy agregando la mía. Lo he probado y funciona 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 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); }];