Envoyer des variables POST sur un serveur PHP

UniXUniX Membre
20:46 modifié dans API AppKit #1
Salut.

Je bloque sur l'envoi de variables POST vers un serveur PHP.
Voici le code que j'utilise :
NSURL *someUrl = [NSURL URLWithString:@&quot;http://julien.free.fr/service.php&quot;];<br />	<br />NSMutableURLRequest* postURLRequest = [NSMutableURLRequest requestWithURL:someUrl];<br />	<br />[postURLRequest setHTTPMethod:@&quot;POST&quot;];<br />	<br />[postURLRequest setValue:@&quot;julien@free.fr&quot; forHTTPHeaderField:@&quot;email&quot;];<br />[postURLRequest setValue:@&quot;valeur_variable2&quot; forHTTPHeaderField:@&quot;variable2&quot;];<br />[postURLRequest setValue:@&quot;valeur_variable3&quot; forHTTPHeaderField:@&quot;variable3&quot;];<br />	<br />theConnection=[[NSURLConnection alloc] initWithRequest:postURLRequest delegate:self];


Dans mon code PHP, la première chose que je fais, c'est récupérer les variables POST, mais rien n'arrive ....
Lorsque je fait un count($_POST), j'ai 0  :(

Réponses

  • AliGatorAliGator Membre, Modérateur
    juin 2007 modifié #2
    Normal tu remplis les HEADERS de ta requête, pas le messagebody.

    Une requête est composée :
    1) D'un header, qui dit quel est le type de contenu (est-ce que c'est un contenu envoyé en un seul morceau ou plusieurs, avec quel encodage (utf8, ...), quel codage/transformation (urlencoded, quoted-printable, ...), son MIME-Type ("image/png", "text/html", ...), la longueur du message, etc.
    2) D'un corps : dans le cas d'une requête d'interrogation type POST, le corps de la requête contient les données à  envoyer (donc c'est là  justement qu'interviennent tes variables et leurs valeurs), encodées tel que décrit dans le header (en général url-encoded, c'est à  dire genre "cle1=valeur1&cle2=valeur2%20avec%20espace&cle3=valeur3").
    Dans le cas d'une réponse HTTP, le corps de la réponse, c'est le code source du HTML (MIME-Type:text/html), ou les données binaires représentant l'image (image/png, image/jpg, ...) etc.


    Reste plus qu'à  trouver les méthodes Cocoa qui vont bien pour non pas modifier tes headers (surtout que là  tu n'en n'as pas spécialement l'intérêt à  parti éventuellement pour spécifier l'encodage de texte avec le header "Content-Type") mais bien les données à  envoyer.
    De ce que j'ai pu voir très très rapido, y'a bien un setHTTPBody mais ça veut dire que tu dois formatter toi même ton body. A moins qu'il y ait une méthode toute faite dispo autre part que j'ai pas vue.

    Remarque ceci dit c'est pas compliqué à  formatter un body de ce genre :
    - pour chaque paire clé/valeur à  envoyer par post, tu mets la cle (qui ne doit être composé que de caractères [A-Za-z0-9_]*), puis tu mets un "=", puis tu concatère la valeur de ton paramètre, après avoir passé ce dernier à  la moulinette [tt]stringByAddingPercentEscapesUsingEncoding:[/tt] (NSString).
    - concaténer ces "cle=valeurWithEscapes" ainsi construits en mettant des "&" entre chaque

    Et voilà  tu as ton HTTPBody prêt pour être transféré. Préciser quand même dans les headers de ta requête le header "Content-Type" en lui donnant la valeur "application/x-www-form-urlencoded".
    Convertir la NSString en US-ASCII est aussi conseillé (enfin qd tu l'eschapes à  la limite), et préciser le Content-Length dans les header de même.
  • schlumschlum Membre
    juin 2007 modifié #3
    Un petit passage sur tcpdump :

    Les headers :
    Referer: http://...<br />User-Agent: Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr) AppleWebKit/419.2.1 (KHTML, like Gecko) Safari/419.3<br />Content-Type: application/x-www-form-urlencoded<br />Authorization: Basic c2NobHVtOjE5MzE5U0NTODI=<br />Content-Length: 35<br />Connection: keep-alive<br />Host: mon.site.web.com
    

    (le "Content-Length" correspond à  l'exemple ci-dessous)

    Le data :
    Encodé comme URL GET...
    Exemple :
    id=150&amp;texte=Ceci%20est%20un%20test
    


    Voilà Â  ;)
  • UniXUniX Membre
    20:46 modifié #4
    OK les gars.

    Je ne suis pas vraiment calé dans le HTTP ..... J'ai fait quelques essais rapides, et à  priori c'est bon. Je vais mettre tout ça au propre.

    Merci.
Connectez-vous ou Inscrivez-vous pour répondre.