Подтвердить что ты не робот

AFNetworking 2.0 - "неприемлемый тип контента: текстовый/обычный"

Я использую AFNetworking 2.0 для чтения JSON из службы, которую я создаю (теперь localhost) в Node. Довольно нормальный материал.

Node отправляет JSON так:

res.setHeader('Content-Type','application/json');
res.end( JSON.stringify(...));

Мой код первого прохода iOS пытается прочитать такие данные:

typedef void(^NextBlock)();
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

manager.responseSerializer = [AFJSONResponseSerializer serializer];
[manager GET:self.newestTimestampURL.absoluteString
    parameters:nil
    success:^(AFHTTPRequestOperation *operation, id responseObject)
    {
        //NSDictionary *response =
        NSLog(@"got %@", responseObject );
    }
    failure:^(AFHTTPRequestOperation *operation, NSError *error)
    {
        NSLog(@"fail %@", error );
    }];

Это ошибка, которую я получаю:

Error Domain=AFNetworkingErrorDomain Code=-1016 "Request failed: unacceptable content-type: text/plain" UserInfo=0xb783e30 {NSErrorFailingURLKey=http://localhost:3000/api/v1/log/newest, AFNetworkingOperationFailingURLResponseErrorKey=<NSHTTPURLResponse: 0xb656a70> { URL: http://localhost:3000/api/v1/log/newest } { status code: 200, headers {
Connection = "keep-alive";
ContentType = "application/json";
Date = "Fri, 27 Dec 2013 20:58:50 GMT";
"Transfer-Encoding" = Identity;
} }, NSLocalizedDescription=Request failed: unacceptable content-type: text/plain}

Я могу закрутить (-i) url http://localhost:3000/api/v1/log/newest и получить ожидаемые данные, и это приложение /json, как ожидалось. Если я загружу эти данные в своем веб-браузере, я получаю JSON, как ожидалось, для каждого инспектора инструментов.

Но используя AFNetworking, я получаю эту загадочную "неприемлемую версию content-type: text/plain". Любая идея?

ПРИМЕЧАНИЕ. Я никогда раньше не использовал AFNetworking, поэтому я, вероятно, неправильно его использую.

4b9b3361

Ответ 1

Кажется, что сервер отправляет "text/html", и этот тип по умолчанию не поддерживается. Добавить @ "text/html" для "approContentTypes"

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

Ответ 2

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

работайте для меня.

Ответ 3

Работайте для меня.

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

Ответ 4

Просто используйте:

СВИФТ:

manager.responseSerializer.acceptableContentTypes = NSSet(object: "text/plain") as Set<NSObject>

OBJ-С:

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

Ответ 5

Я выполнил ответ, отправленный @KIO, но он не работал в моем сценарии.

После многих ответов я смог найти решение, которое сработало для меня.

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;

Ответ 6

NSURL *url = [NSURL URLWithString:RSS_WORLD_NEWS];
NSURLRequest *request = [NSURLRequest requestWithURL:url];

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

// Make sure to set the responseSerializer correctly
operation.responseSerializer = [AFXMLParserResponseSerializer serializer];

operation.responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"application/rss+xml"];

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {

    NSXMLParser *XMLParser = (NSXMLParser *)responseObject;
    [XMLParser setShouldProcessNamespaces:YES];

     XMLParser.delegate = self;
     [XMLParser parse];

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {

    [MBProgressHUD hideHUDForView:self.view animated:YES];
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Error Retrieving contents"
                                                        message:[error localizedDescription]
                                                       delegate:nil
                                              cancelButtonTitle:@"Ok"
                                              otherButtonTitles:nil];
    [alertView show];

}];

[operation start];

работа для меня

Ответ 7

Обновленное решение для Swift.

Если вы используете AFNetworking в Swift. Тогда это решение может вам помочь. Он будет принимать большинство типов контента.

let manager=AFHTTPRequestOperationManager()

            manager.responseSerializer = AFJSONResponseSerializer(readingOptions: NSJSONReadingOptions.AllowFragments) as AFJSONResponseSerializer

            manager.requestSerializer = AFJSONRequestSerializer() as AFJSONRequestSerializer

            manager.responseSerializer.acceptableContentTypes = NSSet(objects:"application/json", "text/html", "text/plain", "text/json", "text/javascript", "audio/wav") as Set<NSObject>