Ошибка запроса: недопустимый тип контента: text / 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" в набор вручную.

конечно, идеальным решением является изменение типа отправлено с сервера, но для этого вам придется общаться с сервером.


настройка my RequestOperationManager сериализатор ответ для HTTPResponseSerializer Исправлена проблема.

С

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

Свифт

manager.responseSerializer = AFHTTPResponseSerializer()

внесение этого изменения означает, что мне не нужно добавлять acceptableContentTypes на каждый запрос, который я делаю.


Я сделал ответ/Комментарий @jaytrixz еще на один шаг и добавил "text / 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 проверить заголовок AFNetworking

manager.responseSerializer.acceptableContentTypes = nil;

In сюда AFJSONResponseSerializer (по умолчанию) сериализует данные JSON без проверки Content-Type в заголовке ответа.


простой способ включить получение типа контента" текст/обычный":

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

аналогично, если вы хотите включить тип контента "text / html":

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

Я попытался ниже строки в соответствии с ответом @Andrie, но не работал,

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

поэтому после охоты больше, я работал, чтобы заставить его работать успешно.

вот мой код 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;

надеюсь, это поможет кому-то там.


это единственное что я нашел, чтобы работать

-(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 версия 2 ошибка типа контента


у меня была как-то похожая проблема с 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);
 }];