iOS et RestKit: comment get une réponse text / html?

J'ai essayé plusieurs questions StackOverflow, et je ne peux pas find la bonne réponse à ce sujet. J'utilise le plugin POSTMAN pour Chrome pour vérifier mes appels REST et je n'arrive pas à comprendre pourquoi je ne peux pas lire la réponse. Dans les commentaires, vous verrez toutes les différentes tentatives que j'ai faites pour get la réponse.

NSDictionary* session_params = @{SESSION_USERNAME_KEY:SESSION_USERNAME_VALUE, SESSION_PASSWORD_KEY:SESSION_PASSWORD_VALUE}; NSURL* url = [NSURL URLWithSsortingng:SESSION_URL]; RKObjectManager* objectManager = [RKObjectManager managerWithBaseURL:url]; //GET THE **** THING TO INTERPRET A TEXT response //[RKMIMETypeSerialization registerClass:[RKXMLReaderSerialization class] forMIMEType:RKMIMETypeTextXML]; //[objectManager setAcceptHeaderWithMIMEType:@"text/html"]; //[objectManager setAcceptHeaderWithMIMEType:RKMIMETypeTextXML]; //[RKMIMETypeSerialization registerClass:[RKXMLReaderSerialization class] forMIMEType:@"text/html"]; //[RKMIMETypeSerialization registerClass:[RKNSJSONSerialization class] forMIMEType:@"text/html"]; //[objectManager setRequestSerializationMIMEType:@"text/html"]; //END NSMutableURLRequest* request = [objectManager requestWithObject:nil method:RKRequestMethodPOST path:SESSION_URL parameters:session_params]; RKObjectRequestOperation* operation = [objectManager objectRequestOperationWithRequest:request success:^(RKObjectRequestOperation* operation, RKMappingResult* result) { NSLog(@"RESULT [%@]", result); } failure:^(RKObjectRequestOperation *operation, NSError *error) { NSLog(@"ERROR [%@]", error); }]; [operation start]; 

Je pense que la chose la plus irritante est que les choses dont j'ai besoin sont contenues dans la valeur NSLocalizedRecoverySuggestion. C'est une key de session dont j'ai besoin.

SORTIE:

E restkit.network:RKObjectRequestOperation.m:547 La request d'object a échoué: l'opération de requête HTTP sous-jacente a échoué avec erreur: Error Domain = org.restkit.RestKit.ErrorDomain Code = -1016 "Type de contenu attendu {(" application / x-www-form -urlencoded " "application / json")}, obtenu text / html" UserInfo = {0x1c52aed0 NSLocalizedRecoverySuggestion = eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJCbG8uUmVnQWxlcnQuQnJva2VyIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdC9CbG8uUmVnQWxlcnQuQVBJL2FwaSIsIm5iZiI6MTM5MjY0MTY2MSwiZXhwIjoxMzkyNjQ1MjYxLCJ1bmlxdWVfbmFtZSI6IkJ1dHRvbnMiLCJyb2xlIjoiUmVnQWxlcnRDb25zdW1lciJ9.JCTMGJRKlOxEtNrcGodpce-tqsRS4zlApNisKQW6iSw, AFNetworkingOperationFailingURLRequestErrorKey =, NSErrorFailingURLKey = http: // …, NSLocalizedDescription = type de contenu attendu { ("application / x-www-forme-urlencoded", "application / json")}, text obtenu / html, AFNetworkingOperationFailingURLResponseErrorKey =} 2014-02-17 14: 54: 20.808 AppName [5600: 6403] E restkit.network: RKObjectRequestOperation.m: 213 POST 'http: // …' (200 OK / 0 objects) [request = 0.0000s mapping = 0.0000s total = 0.1925s]: Erreur Domaine = org.restkit.RestKit.ErrorDomain Code = -1016 "Type de contenu attendu {(" application / x-www-form-urlencoded " , "application / json")}, obtenu text / html "UserInfo = {0x1c52aed0 NSLocalizedRecoverySuggestion = eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJCbG8uUmVnQWxlcnQuQnJva2VyIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdC9CbG8uUmVnQWxlcnQuQVBJL2FwaSIsIm5iZiI6MTM5MjY0MTY2MSwiZXhwIjoxMzkyNjQ1MjYxLCJ1bmlxdWVfbmFtZSI6IkJ1dHRvbnMiLCJyb2xlIjoiUmVnQWxlcnRDb25zdW1lciJ9.JCTMGJRKlOxEtNrcGodpce-tqsRS4zlApNisKQW6iSw, AFNetworkingOperationFailingURLRequestErrorKey =, NSErrorFailingURLKey = http: // …, NSLocalizedDescription = type de contenu attendu {(" l'application / x-www-format-urlencoded "," application / json ")}, text obtenu / html, AFNetworkingOperationFailingURLResponseErrorKey =}

CODE QUI A TRAVAILLÉ Merci à Wain de m'avoir indiqué le bon path. Je suis un peu déçu que RestKit ne puisse pas gérer une requête aussi simple, et j'ai besoin de RestKit parce que c'est juste un jeton de session pour appeler les autres methods, mais tout ce qui fonctionne je suppose:

 NSDictionary* session_params = @{SESSION_USERNAME_KEY:SESSION_USERNAME_VALUE, SESSION_PASSWORD_KEY:SESSION_PASSWORD_VALUE}; NSURL* url = [NSURL URLWithSsortingng:SESSION_URL]; AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url]; NSMutableURLRequest *request = [httpClient requestWithMethod:@"POST" path:SESSION_URL parameters:session_params]; AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request]; [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { NSSsortingng* response = [operation responseSsortingng]; NSLog(@"response: %@",response); } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"error: %@", [operation error]); }]; [operation start]; 

Ce bit:

"Type de contenu attendu {(" application / x-www-format-urlencoded "," application / json ")}, text obtenu / html"

vous indique que vous avez demandé à RestKit d'attendre form-urlencoded ou json , mais que le server renvoie html.

Vous voudrez probablement utiliser setAcceptHeaderWithMIMEType avec le type setAcceptHeaderWithMIMEType JSON pour indiquer au server ce que vous voulez récupérer. Mais, dans ce cas, vous ne devriez probablement pas utiliser RestKit.

RestKit est pour mapper des données JSON / XML arbitraires dans votre model de données. Vous avez juste une key qui revient. Aucune cartographie n'est requirejse. Donc, n'utilisez pas RestKit, utilisez plutôt AFNetworking (auquel vous avez un access complet car RestKit l'utilise en interne.

Merci à Wain et Quintin, c'était très utile pour moi 🙂

Je pense que certains noms ont changé dans les versions plus récentes de Restkit ou AFNetworking . J'ai utilisé AFNetworking comme expliqué dans d'autres réponses car le server ne AFNetworking pas json mais vide à la place. C'était seulement sur un point final particulier où je cherchais un jeton dans les en-têtes de la réponse.

Partager mon morceau de code ici aussi:

 -(void) find_some_token_with_success:(void (^)(AFRKHTTPRequestOperation *operation, id responseObject))success failure:(void (^)(AFRKHTTPRequestOperation *operation, NSError *error))failure { NSURL *baseURL = [NSURL URLWithSsortingng:@"https://example.com"]; AFRKHTTPClient *client = [AFRKHTTPClient clientWithBaseURL:baseURL]; [client setDefaultHeader:@"Accept" value:RKMIMETypeJSON]; [client setDefaultHeader:@"some_custom_header" value:@"some_custom_value"]; NSMutableURLRequest *request = [client requestWithMethod:@"GET" path:@"/api/v1/some_non_json_endpoint" parameters:nil]; AFRKHTTPRequestOperation *operation = [[AFRKHTTPRequestOperation alloc] initWithRequest:request]; [operation setCompletionBlockWithSuccess:success failure:failure]; [operation start]; } 

Puis j'ai utilisé quelque chose comme ça pour get l'en-tête que je cherchais:

 -(void) get_the_token:(void (^)(NSSsortingng *token))withTokenCallback failure:(void (^)(AFRKHTTPRequestOperation *operation, NSError *error))failure { [self xsrftoken_with_success:^(AFRKHTTPRequestOperation *operation, id responseObject) { NSSsortingng *token = [self get_the_token_from_response:[operation response]]; withTokenCallback(token); } failure:failure]; } -(NSSsortingng *) get_the_token_from_response: (NSHTTPURLResponse *) response; { NSDictionary *headerDictionary = response.allHeaderFields; NSSsortingng *token = [headerDictionary objectForKey:@"SOME-TOKEN-KEY"]; return token; } 

Donc, tout cela peut simplement être utilisé comme ceci:

 - (void)testGetSometokenInARequest { XCTestExpectation *expectation = [self expectationWithDescription:@"Query timed out."]; [[SomeRequestWithoutJsonResponse alloc] get_the_token:^(NSSsortingng *token) { [expectation fulfill]; NSLog(@"token: %@", token); // this token should be 100 characters long XCTAssertTrue([token length] == 100); } failure:^(AFRKHTTPRequestOperation *operation, NSError *error) { NSLog(@"error: %@", [operation error]); }]; [self waitForExpectationsWithTimeout:10.0 handler:nil]; } 

En d'autres termes, get_the_token prend un callback avec le jeton désiré et un callback d'échec.

Assurez-vous d'inclure <RestKit/RestKit> pour avoir access à AFNetowkring de AFNetowkring 🙂


Solution de travail alternative utilisant le kit de réparation:

RestKit: Comment gérer une réponse vide.body?

Et vous enregistrez un sérialiseur pour ce type de Mimetype comme ceci:

 [RKMIMETypeSerialization registerClass:[RKNSJSONSerialization class] forMIMEType:@"text/plain"];