Запрос не выполнен: недопустимый тип содержимого: text / html с использованием AFNetworking 2.0

205

Я пробую новую версию 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.

jaytrixz
источник

Ответы:

361

Это означает, что ваш сервер отправляет "text/html"вместо уже поддерживаемых типов. Мое решение было добавить, "text/html"чтобы acceptableContentTypesустановить в AFURLResponseSerializationклассе. Просто @"text/html"выполните поиск «acceptContentTypes» и добавьте в набор вручную.

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

Андрей Ниг
источник
142
Спасибо! Я просто добавил этот код, чтобы он работал:op.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
jaytrixz
13
Для PHP это так же просто, как добавить это на страницу: header ("Content-Type: application / json"); (если это не ответ JSON, то XML или что-то в этом роде)
rckehoe
1
@rckehoe Спасибо за это - гораздо предпочтительнее изменить заголовок страницы, чем acceptableContentTypes:)
Ник
43
Альтернатива комментарию @jaytrixz - просто добавить новый тип контента к уже существующим:op.responseSerializer.acceptableContentTypes = [op.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
mgarciaisaia
11
Свифт код:op.responseSerializer.acceptableContentTypes = NSSet(object: "text/html")
Хусам
178

Установка моего RequestOperationManagerсериализатора ответа для HTTPResponseSerializerустранения проблемы.

Objective-C

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

стриж

manager.responseSerializer = AFHTTPResponseSerializer()

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

Danpe
источник
2
Я сделал это, и это вылетает из моего приложения. Возвращаясь к использованиюAFJSONResponseSerializer
Jaytrixz
2
@jaytrixz Это зависит от того, если ваш сервер всегда отвечает JSON, вы должны установить responseSerializerдля AFJSONResponseSerializer.
Данпе
2
Теперь вы получите responseObject как NSData, и вам необходимо проанализировать JSON в блоке успеха.
Кэмерон Лоуэлл Палмер
1
Потому что я использую стручки, поэтому этот способ лучше.
Ён Хо
@Danpe, как конвертировать вышеуказанную строку кода в Swift. Я пытался с manager.responseSerializer = AFJSONResponseSerializer.serializer (), но бесполезно.
Ганеш Гутури
72

Я сделал еще один шаг к ответу / комментарию @ jaytrixz и добавил «text / html» к существующему набору типов. Таким образом, когда они фиксируют это на стороне сервера как «application / json» или «text / json», я утверждаю, что это будет работать без проблем.

  manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
mharper
источник
2
Согласовано. Принятый ответ на этот вопрос имеет огромный недостаток в том, что он создает бомбу замедленного действия, которая взорвется, когда на стороне сервера будет установлен правильный тип содержимого.
Эрик Голдберг,
Это кажется правильным в теории, но кто-нибудь на самом деле проверял это?
Minimi
32

На стороне сервера я добавил:

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

в мой код .php, и это также решило проблему.

Крис Принс
источник
3
if(!headers_sent() ) { header('Content-Type: application/json'); } Это хорошее исправление
elliotrock
17

Я решаю эту проблему с другой точки зрения.

Я думаю, если сервер отправляет данные JSON с Content-Type: text/htmlзаголовком. Это не значит, что серверный парень намеревался отправить вам html, но случайно сменил JSON. Это означает, что парня на сервере просто не заботит Content-Typeзаголовок. Так что, если парню сервера не все равно, как на стороне клиента, лучше игнорировать Content-Typeзаголовок. Чтобы игнорировать Content-Typeзаголовок, проверьте вAFNetworking

manager.responseSerializer.acceptableContentTypes = nil;

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

dopcn
источник
Совершенно верно. Игнорируя тип контента, я не получаю свой контент как шестнадцатеричный код, так и как неудачный ноль-ответ. Это прекрасно работает! Спасибо
Брэндон
7

Простой способ включить получение «текстового / простого» типа контента:

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

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

manager.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
да Роча Пирес
источник
5

Я попробовал ниже строки согласно ответу @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;

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

ABS
источник
1
+1. Это окончательно решение. Поскольку вы должны установить приемлемый тип контента как на сериализаторе, если это сериализатор JSON (который обычно использует «application / json»), так и на операцию. В противном случае вы получите ошибку настроек только при работе.
Лоретопариси
3

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

-(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);
    }];
}
chrisallick
источник
3

Если кто-то использует, AFHTTPSessionManagerто можно решить эту проблему,

Я подкласс, AFHTTPSessionManagerгде я делаю так,

NSMutableSet *contentTypes = [[NSMutableSet alloc] initWithSet:self.responseSerializer.acceptableContentTypes];
[contentTypes addObject:@"text/html"];
self.responseSerializer.acceptableContentTypes = contentTypes;
Hemang
источник
2

В моем случае у меня нет контроля над настройками сервера, но я знаю, что ожидается «application / json» для «Content-Type». Я сделал это на стороне клиента iOS:

manager.requestSerializer = [AFJSONRequestSerializer serializer];

обратитесь к AFNetworking версии 2 ошибка типа контента

uudaddy
источник
1

Просто добавьте эту строку:

operation.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"];
Elangovan
источник
0

У меня была похожая проблема при работе с AFNetworking из кодовой базы Swift, поэтому я просто оставляю это здесь в удаленном случае, кому-то так же не повезло, как мне, работающему в такой установке. Если да, я чувствую тебя дружище, оставайся сильным!

Операция неудачи из - за «неприемлемый контент типа», несмотря на меня фактически установив acceptableContentTypesс Setсодержащим значением типа контента.

Думаю , я решил настроить код Swift, чтобы он был более дружественным к Objective-C :

serializer.acceptableContentTypes = NSSet(array: ["application/xml", "text/xml", "text/plain"]) as Set<NSObject>
mokagio
источник
0

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

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);
}];
Hemang
источник
-1
 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);
 }];
Spydy
источник