example afhttprequestoperation ios afnetworking afnetworking-2

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



afnetworking vs alamofire (14)

Estoy probando la nueva versión 2.0 de AFNetworking y recibo el error anterior. ¿Alguna idea de por qué esto está pasando? 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=<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 utilizando kJSONlink. Esto debería devolver un JSON.


Al establecer mi RequestOperationManager Response Serializer en HTTPResponseSerializer solucionó el problema.

C objetivo

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 haga.


En el lado del servidor, he añadido:

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

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


En mi caso, no tengo control sobre la configuración del servidor, 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 de tipo de contenido de la versión 2 de AFNetworking.


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


Esto significa que su servidor está enviando "text/html" lugar de los tipos ya compatibles. Mi solución fue agregar "text/html" a 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.


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 funcionara con éxito.

Aquí está mi código 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;

Espero que esto ayude a alguien por ahí.


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

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


Resuelvo este problema desde una perspectiva diferente.

Creo que si el servidor envía datos JSON con el Content-Type: text/html . No significa que el chico del servidor tenía la intención de enviarle un código html, sino que cambió accidentalmente a JSON. Significa que al encargado del servidor simplemente no le importa qué es el encabezado Content-Type . Entonces, si a la persona del servidor no le importa el lado del cliente, mejor ignore también el encabezado Content-Type . Para ignorar la verificación del encabezado Content-Type en AFNetworking

manager.responseSerializer.acceptableContentTypes = nil;

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


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 agrega esta línea:

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


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

La operación fracasó debido a un "tipo de contenido inaceptable", a pesar de que en realidad establecí los tipos de contenido 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 que fuera más compatible 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 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); }];


Una forma sencilla de habilitar para recibir el tipo de contenido "texto / plano":

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

Del mismo modo, si desea habilitar el tipo de contenido "texto / html":

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


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