Aucune donnée reçu avec NSURLSession
Bonjour tout le monde,
J'ai requête POST qui marche bien (aucune erreur n'apparait et j'arrive bien sur la page que je veux) mais je ne recois aucune donnée en retour..
J'ai un formulaire à cette adresse https://conventiondestage.insa-toulouse.fr/index.php et lorsque je remplie le forumlaire et que je me connecte, je me retrouve à cette adresse : https://conventiondestage.insa-toulouse.fr/accueil.php. J'ai donc fait une fonction qui permet de remplir et de valider le formulaire à travers une requete POST et ça fonctionne bien car j'ai bien dans les logs l'url https://conventiondestage.insa-toulouse.fr/accueil.php qui s'affiche. Mais seulement j'aimerai que ça me retourne le contenu html de la page https://conventiondestage.insa-toulouse.fr/accueil.php. Comment faire ? Car la variable data de ma fonction renvoie nul...
Voici les logs de la console :
2014-04-07 17:52:00.207 myINSA[22797:60b] Response:<NSHTTPURLResponse: 0x14e92d50> { URL: https://conventiondestage.insa-toulouse.fr/accueil.php } { status code: 200, headers {
"Cache-Control" = "no-store, no-cache, must-revalidate";
Connection = "Keep-Alive";
"Content-Encoding" = gzip;
"Content-Length" = 1428;
"Content-Type" = "text/html";
Date = "Mon, 07 Apr 2014 15:52:00 GMT";
Expires = "Mon, 26 Jul 1997 05:00:00 GMT";
"Keep-Alive" = "timeout=15, max=100";
Pragma = "no-cache";
Server = "Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny16 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g";
Vary = "Accept-Encoding";
"X-Powered-By" = "PHP/5.2.6-1+lenny16";
} } (null)
2014-04-07 17:52:00.210 myINSA[22797:60b] Data = (null)
la fonction que j'utilise (j'ai récupéré les valeurs du header grâce à une extension Chrome mais ça ne change rien si je les met ou pas dans le code) :
- (IBAction)pushLogin:(id)sender {
NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]];
NSURL *url = [NSURL URLWithString:@https://conventiondestage.insa-toulouse.fr/index.php];
NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url];
NSString * params =@login=myLogin&password=myPass;
[urlRequest setHTTPMethod:@POST];
[urlRequest addValue:@max-age=0 forHTTPHeaderField:@Cache-Control];
[urlRequest addValue:@application/x-www-form-urlencoded forHTTPHeaderField:@Content-Type];
[urlRequest addValue:@text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 forHTTPHeaderField:@Accept];
[urlRequest addValue:@keep-alive forHTTPHeaderField:@Connection];
[urlRequest addValue:@https://conventiondestage.insa-toulouse.fr forHTTPHeaderField:@Origin];
[urlRequest addValue:@Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36 forHTTPHeaderField:@User-Agent];
[urlRequest addValue:@gzip,deflate,sdch forHTTPHeaderField:@Accept-Encoding];
[urlRequest addValue:@https://conventiondestage.insa-toulouse.fr/index.php forHTTPHeaderField:@Referer];
[urlRequest addValue:@conventiondestage.insa-toulouse.fr forHTTPHeaderField:@Host];
[urlRequest addValue:@fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4 forHTTPHeaderField:@Accept-Language];
[urlRequest setHTTPBody:[params dataUsingEncoding:NSUTF8StringEncoding]];
NSURLSessionDataTask *dataTask =[defaultSession dataTaskWithRequest:urlRequest
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSLog(@Response:%@ %@\n", response, error);
if(error == nil)
{
NSString *text = [[NSString alloc] initWithData:data encoding: NSUTF8StringEncoding];
NSLog(@Data = %@",text);
}
}];
[dataTask resume];
}
et j'ai même essayé avec une autre fonction mais ça me renvoie le même résultat (la requête fonctionne mais ne renvoie pas le contenu de la page) :
NSMutableURLRequest *request =[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@https://conventiondestage.insa-toulouse.fr/index.php]];
[request setHTTPMethod:@POST];
NSString *post =@login=mylogin&password=mypass;
[request setHTTPBody:[post dataUsingEncoding:NSUTF8StringEncoding]];
NSURLResponse *response;
NSError *err;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
NSLog(@Data = %@",[[NSString alloc] initWithData:responseData encoding: NSUTF8StringEncoding]);
Je suppose que vopus allez vous rendre compte de mon erreur assez facilement et je vous remercie d'avance pour votre aide !
Réponses
Tu logs text et non pas data. Dans l'doute, as-tu regardé si data était nul ? Car cela pourrait être le initWithData:encoding qui merde en fonction de l'encoding utilisé.
Que vaut le textEncodingName de la NSURLResponse ? Si ce n'est pas de l'UTF-8 qu'il te répond (et connaissant le site de l'INSA ça ne m'étonnerai pas ^^) et que toi tu essayes de convertir tes donnes en string en utilisant UTF-8 sans vérifier, c'est sur qu'il va avoir du mal à te convertir ton NSData en une NSString valide ;-)
Merci beaucoup, en effet la page était encodé en Latin-1, j'ai donc utilisé ça NSISOLatin1StringEncoding et ça a fonctionné parfaitement !
Une petite dernière question, si je veux maintenant afficher le contenu de la page https://conventiondestage.insa-toulouse.fr/etudiant/tableau_de_bord.php qui n'est accessible que lorsqu'on est connecté au service, comment je fais ? Car si je rajoute ça à la suite de ma fonction il me renvoie sur une page d'erreur ce qui est logique car il ne fait pas la liaison entre cette nouvelle connection et celle juste avant :
Merci beaucoup pour votre aide !