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