Ошибка запроса: недопустимый тип контента: текст / html с использованием AFNetworking 2.0
Я пробую новую версию 2.0 AFNetworking, и я получаю ошибку выше. Есть идеи, почему это происходит? Вот мой код:
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];
Я использую Xcode 5.0.
кроме того, вот сообщение об ошибке:
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}
Я просто спрятал JSON с помощью kJSONlink. Эта команда должна вернуть в формате JSON.
14 ответов:
Это означает, что ваш сервер посылает
"text/html"вместо уже поддерживаемых типов. Мое решение было добавить"text/html"доacceptableContentTypesустановить вAFURLResponseSerializationкласса. Просто найдите "acceptableContentTypes" и добавьте@"text/html"в набор вручную.конечно, идеальным решением является изменение типа отправлено с сервера, но для этого вам придется общаться с сервером.
настройка
RequestOperationManagerответ сериализатора наHTTPResponseSerializerИсправлена проблема.С
manager.responseSerializer = [AFHTTPResponseSerializer serializer];Свифт
manager.responseSerializer = AFHTTPResponseSerializer()внесение этого изменения означает, что мне не нужно добавлять
acceptableContentTypesна каждый мой запрос.
Я взял ответ/Комментарий @jaytrixz еще на один шаг и добавил "текст / html" к существующему набору типов. Таким образом, когда они исправляют его на стороне сервера в "application/json" или "text/json", я утверждаю, что он будет работать без проблем.
manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
на стороне сервера, я добавил:
header('Content-type: application/json');в моей .PHP-код, и это также исправлена проблема.
Я решить эту проблему с другой точки зрения.
Я думаю, если сервер отправляет данные JSON с
Content-Type: text/htmlзаголовок. Это не значит, что серверный парень намеревался отправить вам какой-то html, но случайно изменился на JSON. Это означает, что серверный парень просто не заботится о том, что это. Поэтому, если серверный парень не заботится как клиентская сторона, вам лучше игнорироватьContent-Typeзаголовок. ИгнорироватьContent-Typeпроверить заголовокAFNetworkingmanager.responseSerializer.acceptableContentTypes = nil;In таким образом,
AFJSONResponseSerializer(по умолчанию) будет сериализовать данные JSON без проверкиContent-Typeв заголовке ответа.
простой способ, чтобы позволить получить" текст/простой " тип контента:
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/plain"];аналогично, если вы хотите включить тип контента "текст / html":
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
Я попытался ниже строки в соответствии с ответом @Andrie, но не получилось,
op.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];Так что после охоты больше, я работал вокруг, чтобы заставить его работать успешно.
вот мой фрагмент кода.
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;надеюсь, что это поможет кому-то там.
это единственное что я нашел, чтобы работать
-(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); }]; }
Если кто-то использует
AFHTTPSessionManagerтогда можно сделать так, чтобы решить эту проблему,Я подкласса
AFHTTPSessionManagerгде я это делаю,NSMutableSet *contentTypes = [[NSMutableSet alloc] initWithSet:self.responseSerializer.acceptableContentTypes]; [contentTypes addObject:@"text/html"]; self.responseSerializer.acceptableContentTypes = contentTypes;
просто добавьте эту строку:
operation.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
в моем случае у меня нет контроля над настройкой сервера, но я знаю, что он ожидает "application/json" для "Content-Type". Я сделал это на стороне клиента iOS:
manager.requestSerializer = [AFJSONRequestSerializer serializer];
у меня была как-то похожая проблема, работающая с AFNetworking из Swift-кодовой базы, поэтому я просто оставляю это здесь в удаленном случае, когда кому-то так же не повезло, как мне, чтобы работать в такой настройке. если ты, я чувствую, что ты приятель, оставаться сильным!
операция не удалась из-за" неприемлемого типа контента", несмотря на то, что я фактически установил
acceptableContentTypesСSetсодержит значение типа контента, о котором идет речь.решение для меня было подправить Swift код, чтобы быть более объективным - c дружественным,Я думаю:
serializer.acceptableContentTypes = NSSet(array: ["application/xml", "text/xml", "text/plain"]) as Set<NSObject>
хороший вопрос всегда есть несколько ответов, чтобы уменьшить и помочь вам выбрать правильный ответ, вот я тоже добавлял свои. Я проверил его, и он отлично работает.
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); }];
Comments