web-dev-qa-db-fra.com

AFNetworking 2.0 - "type de contenu inacceptable: text/plain"

J'utilise AFNetworking 2.0 pour lire JSON à partir d'un service que je suis en train de construire (actuellement sur localhost) dans Node. Jolies choses normales. 

Le nœud envoie JSON comme suit:

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

Mon code de premier passage iOS tente de lire ces données comme suit:

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

C'est l'erreur que j'obtiens:

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}

Je peux curl (-i) l'url http://localhost:3000/api/v1/log/newest et obtenir les données que j'attends, et c'est application/json comme prévu. Si je charge ces données dans mon navigateur Web, je reçois le code JSON attendu par l'inspecteur d'outils de développement.

Mais en utilisant AFNetworking, j'obtiens cette mystérieuse erreur "inacceptable content-type: text/plain". Une idée?

REMARQUE: je n'ai jamais utilisé AFNetworking auparavant, je l'utilise donc probablement de manière incorrecte.

28
TomorrowPlusX

Il semble que le serveur envoie "text/html", et ce type n'est pas supporté par défaut. Ajouter @ "text/html" pour "acceptableContentTypes"

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

manager.responseSerializer = [AFHTTPResponseSerializer serializer];

travaille pour moi.

21
shebelaw

Travaille pour moi.

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

Il suffit d'utiliser:

Rapide:

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

OBJ-C:

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

J'ai suivi la réponse postée par @KIO mais cela n'a pas fonctionné dans mon scénario.

Après être allé avec beaucoup de réponses, j'ai pu trouver une solution qui a fonctionné pour moi.

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;
4
ABS

Solution mise à jour pour Swift.

Si vous utilisez AFNetworking dans Swift. Alors cette solution pourrait vous aider. Il acceptera la plupart des types de contenu.

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>
0
Sourabh Sharma
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];

travaille pour moi 

0