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