Помилка запиту: неприйнятний тип вмісту: 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.

Відповіді:


361

Це означає, що ваш сервер надсилає "text/html"замість уже підтримуваних типів. Моє рішення було додати "text/html"до acceptableContentTypesнабору в AFURLResponseSerializationкласі. Просто знайдіть "приемлемые типи" і додайте @"text/html"їх до набору вручну.

Звичайно, ідеальне рішення - змінити тип, що надсилається з сервера, але для цього вам доведеться поговорити з командою сервера.


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вирішення проблеми.

Ціль-С

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

Швидкий

manager.responseSerializer = AFHTTPResponseSerializer()

Внесення цих змін означає, що мені не потрібно додавати acceptableContentTypesдо кожного запиту, який я роблю.


2
Я зробив це, і це завершує роботу моєї програми. Повернення до використанняAFJSONResponseSerializer
— jaytrixz

2
@jaytrixz Це залежить, якщо ваш сервер завжди відповідає JSON , ви повинні встановити responseSerializerв AFJSONResponseSerializer.
— Danpe

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"];

2
Домовились. Прийнята відповідь на це питання має величезний недолік у тому, що вона створює бомбу часу, яка вибухне, коли сторона сервера буде виправлена, щоб повернути правильний тип вмісту.
— Ерік Голдберг,

Теоретично це здається правильним, але хтось насправді це перевіряв?
— Мінімі

32

На стороні сервера я додав:

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

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


3
if(!headers_sent() ) { header('Content-Type: application/json'); }
— Приємне

17

Я вирішую цю проблему з іншої точки зору.

Я думаю, якщо сервер надсилає дані JSON із Content-Type: text/htmlзаголовком. Це не означає, що сервер, який мав намір надіслати вам HTML, але випадково змінився на JSON. Це означає, що хлопця сервера просто не хвилює, що таке Content-Typeзаголовок. Отже, якщо хлопець сервера не переймається стороною клієнта, ви також краще проігноруйте Content-Typeзаголовок. Щоб ігнорувати Content-Typeреєстрацію заголовкаAFNetworking

manager.responseSerializer.acceptableContentTypes = nil;

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


Точно правильно. Ігноруючи тип вмісту, я не отримую вміст ні шістнадцятковим кодом, ні як невдалою нульовою відповіддю. Це чудово працює! Дякую
— Брендон

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;

Сподіваюся, це допоможе комусь там.


1
+1. Це остаточно рішення. Оскільки вам потрібно встановити прийнятний тип вмісту як на серіалізаторі, якщо це серіалізатор JSON (який зазвичай використовується "application / json"), так і операцію. Інакше ви отримаєте налаштування помилки лише під час роботи.
— loretoparisi

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

3

Якщо хтось використовує AFHTTPSessionManager то можна зробити так, щоб вирішити проблему,

Я підкласифікував, AFHTTPSessionManagerде я так роблю,

NSMutableSet *contentTypes = [[NSMutableSet alloc] initWithSet:self.responseSerializer.acceptableContentTypes];
[contentTypes addObject:@"text/html"];
self.responseSerializer.acceptableContentTypes = contentTypes;

2

У моєму випадку я не маю контролю над налаштуваннями сервера, але я знаю, що очікує "application / json" для "Content-Type". Я зробив це на стороні клієнта iOS:

manager.requestSerializer = [AFJSONRequestSerializer serializer];

зверніться до помилки типу вмісту типу AFNetworking 2


1

Просто додайте цей рядок:

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

0

У мене була якась схожа проблема з роботою з AFNetworking із кодової бази Swift, тому я просто залишаю це у віддаленому випадку, коли хтось такий невдалий, як мені доводиться працювати в таких налаштуваннях. Якщо ти є, я відчуваю себе приятелем, будь сильним!

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

Рішення для мене було підправити код Swift більш Objective-C дружній, я думаю :

serializer.acceptableContentTypes = NSSet(array: ["application/xml", "text/xml", "text/plain"]) as Set<NSObject>

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

-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);
 }];
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.