Error de request: tipo de contenido inaceptable: text / html utilizando AFNetworking 2.0

Estoy probando la nueva versión 2.0 de AFNetworking y obtengo 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]; 

Cualquier idea será apreciada. También estoy usando Xcode 5.0 si eso ayuda. ¡Gracias!

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

 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} 

Acabo de ocultar el JSON usando kJSONlink. Esto debería devolver un JSON.

Esto significa que su server está enviando "text/html" lugar de los types ya soportados. Mi solución fue agregar "text/html" a acceptableContentTypes establecido en la class AFURLResponseSerialization . Simplemente busque "acceptableContentTypes" y agregue @"text/html" al set manualmente.

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

Configurar el Serializador de 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 a cada request que hago.

Tomé la respuesta / comentario de @ jaytrixz un paso más y agregué "text / html" al set de types existentes. De esta forma, cuando lo arreglan en el server para "application / json" o "text / json", afirmo que funcionará a la perfección.

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

En el lado del server, 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 server envía datos JSON con Content-Type: text/html header. No significa que el server intentó enviarle algún html pero accidentalmente lo cambió a JSON. Significa que al tipo de server no le importa lo que es el encabezado Content-Type . Entonces, si al tipo de server no le importa el lado del cliente, es mejor que ignore también el encabezado Content-Type . Para ignorar la comprobación del encabezado del Content-Type en AFNetworking

 manager.responseSerializer.acceptableContentTypes = nil; 

De esta forma, el AFJSONResponseSerializer (el pnetworkingeterminado) serializará los datos JSON sin verificar el tipo de 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"]; 

Probé 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 search más, trabajé para que funcione con éxito.

Aquí está mi snip 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.

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,

Subclass AFHTTPSessionManager donde estoy haciendo así,

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

Simplemente agregue esta línea:

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

En mi caso, no tengo control sobre la configuration del server, pero sé que está esperando "application / json" para "Content-Type". Hice esto en el lado del cliente iOS:

 manager.requestSerializer = [AFJSONRequestSerializer serializer]; 

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

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

Tuve un problema de alguna manera similar al trabajar con AFNetworking desde una base de código Swift, así que estoy dejando esto aquí en el caso remoto, alguien tiene tan mala suerte como yo tener que trabajar en una configuration así. Si lo eres, siento que eres amigo, ¡mantente fuerte!

La operación estaba fallando debido a "tipo de contenido inaceptable", a pesar de que en realidad establecía acceptableContentTypes con un Set contiene el valor del tipo de contenido en cuestión.

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

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

Una buena pregunta siempre tiene múltiples respuestas, para networkingucirlo 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); }];