1
2 071

Envoyer une requête HTTP à un service web

Les échanges directs entre des services sur le web sont devenus incontournables. Apprenez comment envoyer une requête HTTP(S) en GET ou en POST à un serveur et à publier une interface machine à machine.

NOTE : La fonction sendhttp et ses variantes de la librairie iZend est une application directe et plus complète de cet article.

Scénario

sendfax est un service disponible sur le web qui permet d'envoyer un document par fax. Un site propose ce service via un formulaire. Un utilisateur remplit le formulaire et l'envoie au site. Le site en extrait les informations et les transmet au service. Le service valide la requête, l'exécute et renvoie un code de retour au site. Le site affiche le résultat de la requête à l'utilisateur.

Fax express

À qui voulez-vous envoyer un fax ?

Entrez une série de numéros de téléphone.

Quel document voulez-vous faxer ?

Sélectionnez un fichier texte ou une image.

Remplissez le formulaire et appuyez sur Faxer.

Remplissez le formulaire et appuyez sur le bouton Faxer. Essayez d'envoyer différents formulaires incomplets. NOTE : Dans cette version de démonstration, aucun fax n'est vraiment envoyé.

Le navigateur génère un document HTTP/POST et l'envoie à la fonction faxexpress du site. faxexpress extrait le contenu du document et transmet directement la liste des numéros de téléphone et le fichier en pièce jointe au service sendfax à l'aide de la fonction sendhttp. sendfax analyse les paramètres de la requête. En cas d'erreur, si la liste de numéros de téléphone est vide ou invalide ou si le fichier est manquant ou trop gros, le service renvoie un document HTTP contenant le texte KO_MISSINGNUMBER, KO_BADNUMBER, KO_MISSINGFILE ou KO_BADFILE. NOTE : Un service réel aura probablement d'autres paramètres tels qu'un identifiant et un mot de passe. Si tous les paramètres sont corrects, le service envoie le fax et retourne un document HTTP contenant le texte OK ou KO_FAXNOTSENT en cas d'erreur. Le site analyse la réponse du service, le code de retour HTTP et le contenu du document, et renvoie un document au navigateur contenant soit un message de confirmation, soit un ou plusieurs messages d'erreur.

Tout le dialogue entre le site et le service, entre faxpress et sendfax, est en HTTP correct. Un service élaboré peut très bien retourné différents code HTTP, tel que 400 Bad Request quand une requête est rejetée ou 403 Forbidden si le demandeur ne peut pas être identifié. Le format des données échangées entre un client et un service peut aussi être plus complexe et le contenu du dialogue encodé en PHP sérialisé ou en XML.

Réalisation

Organisez le contenu de votre site en créant dans la racine du site les dossiers public pour les pages publiées sur le web, api pour les points d'entrée du service et library pour les fonctions en PHP. Ajoutez les fichiers faxexpress.php, sendfax.php et sendhttp.php respectivement dans les dossiers public, api et library avec les contenus suivants :

  1. /
    1. public
      1. faxexpress.php
    2. api
      1. sendfax.php
    3. library
      1. sendhttp.php
  1. <?php
  2. require_once 'sendhttp.php';

Charge le code de la fonction sendhttp.

  1. define('OK', 'OK');
  2. define('KO_MISSINGNUMBER', 'KO_MISSINGNUMBER');
  3. define('KO_BADNUMBER', 'KO_BADNUMBER');
  4. define('KO_MISSINGFILE', 'KO_MISSINGFILE');
  5. define('KO_BADFILE', 'KO_BADFILE');
  6. define('KO_FAXNOTSENT', 'KO_FAXNOTSENT');

Définit les codes de retour renvoyés par le service.

  1. $site_host=$_SERVER['SERVER_NAME'];
  2. $path='/api/sendfax.php';
  3. $proto='http';

Initialise l'adresse du serveur et le chemin d'accès du service. Mettez de préférence $proto à 'https' si le serveur est sécurisé.

  1. $to=$files=false;
  2. $action='init';
  3.  
  4. if (isset($_POST['fax_send'])) {
  5.     $action='send';
  6. }
  7.  
  8. switch($action) {
  9.     case 'send':
  10.         if (isset($_POST['fax_to'])) {
  11.             preg_match_all('/([\d]+)/', $_POST['fax_to'], $r);
  12.             $to=implode(' ', $r[0]);
  13.         }
  14.  
  15.         if (isset($_FILES['fax_document']['tmp_name']) and $_FILES['fax_document']['tmp_name']) {
  16.             $name=$_FILES['fax_document']['name'];
  17.             $tmp_name=$_FILES['fax_document']['tmp_name'];
  18.             $type=$_FILES['fax_document']['type'];
  19.             $files=array('document' => array('name' => $name, 'type' => $type, 'tmp_name' => $tmp_name));
  20.         }
  21.         break;
  22.     default:
  23.         break;
  24. }

Initialise les paramètres du formulaire, en extrait l'action demandée puis la liste des numéros de téléphone et le fichier en pièce jointe.

  1. $fax_sent=false;
  2. $missing_number=false;
  3. $bad_number=false;
  4. $missing_file=false;
  5. $bad_file=false;
  6. $fax_not_sent=false;

Initialise tous les drapeaux d'information ou d'erreur du formulaire. NOTE : Les champs saisis ne sont volontairement pas validés pour montrer que le service doit dans tous les cas contrôler les données qui lui sont transmises.

  1. switch($action) {
  2.     case 'send':
  3.         $url=$proto.'://'.$site_host.$path;
  4.  
  5.         $args = array(
  6.             'to'        => $to,
  7.         );
  8.         $response=sendpost($url, $args, $files, true);
  9.  
  10.         if (!$response or $response[0] != 200) {
  11.             $fax_not_sent=true;
  12.             break;
  13.         }

Fabrique l'URL et les paramètres de l'appel du service. Envoie la requête avec la fonction sendhttp. sendhttp renvoie un tableau contenant le code de retour HTTP, l'en-tête de la réponse ligne par ligne et le corps de la réponse, ou false en cas d'erreur. Si la réponse est false ou si le code de retour HTTP n'est pas 200, la communication avec le serveur a échoué ou le service a rejeté la requête.

  1.         $r=$response[2];
  2.  
  3.         $codes=explode(';', $r);
  4.  
  5.         foreach ($codes as $c) {
  6.             switch($c) {
  7.                 case OK:
  8.                     $fax_sent=true;
  9.                     break;
  10.                 case KO_MISSINGNUMBER:
  11.                     $missing_number=true;
  12.                     break;
  13.                 case KO_BADNUMBER:
  14.                     $bad_number=true;
  15.                     break;
  16.                 case KO_MISSINGFILE:
  17.                     $missing_file=true;
  18.                     break;
  19.                 case KO_BADFILE:
  20.                     $bad_file=true;
  21.                     break;
  22.                 case KO_FAXNOTSENT:
  23.                 default:
  24.                     $fax_not_sent=true;
  25.                     break;
  26.             }
  27.         }
  28.         break;
  29.     default:
  30.         break;
  31. }
  32. ?>

Extrait le corps de la réponse et analyse les codes de retour renvoyés par le service.

Le reste du code affiche le formulaire de saisie.

  1. <h6 id="faxexpress">Fax express</h6>
  2. <form enctype="multipart/form-data" method="post" action="#faxexpress">
  3. <p>À qui voulez-vous envoyer un fax ?</p>
  4. <p class="<?php echo ($missing_number or $bad_number) ? 'error' : 'info' ?>">Entrez une série de numéros de téléphone.</p>
  5. <p><textarea name="fax_to" id="fax_to" cols="50" rows="2"><?php echo $to; ?></textarea></p>
  6. <p>Quel document voulez-vous faxer ?</p>
  7. <p class="<?php echo ($missing_file or $bad_file) ? 'error' : 'info' ?>">Sélectionnez un fichier texte ou une image.</p>
  8. <p><input type="hidden" name="MAX_FILE_SIZE" value="200000" /><input name="fax_document" id="fax_document" type="file" size="25" /></p>
  9. <p><input name="fax_send" id="fax_send" type="submit" value="Faxer" /></p>
  10. <?php if ($fax_not_sent): ?>
  11. <p class="error">L'envoi du fax a échoué (<?php echo implode(' ', $codes); ?>).</p>
  12. <?php elseif ($fax_sent): ?>
  13. <p class="info">Votre fax a bien été transmis.</p>
  14. <?php else: ?>
  15. <p class="info">Remplissez le formulaire et appuyez sur Faxer.</p>
  16. <?php endif; ?>
  17. </form>
  1. function chkphone($s) {
  2.     return preg_match('/^[0-9]{10,11}$|^\+[0-9]{11}$/', $s);
  3. }
  4.  
  5. function normphone($s) {
  6.     switch(strlen($s)) {
  7.         case 10:
  8.             return '+33'. substr($s,1);
  9.         case 11:
  10.             return '+'. $s;
  11.         default:
  12.             return $s;
  13.     }
  14. }

checkphone retourne true si $s est un numéro de téléphone à 10 ou 11 chiffres, false dans le cas contraire.

normphone ajoute le préfixe +33 à un numéro de téléphone à 10 chiffres ou juste un + devant un numéro de téléphone à 11 chiffres. NOTE : Adaptez ces fonctions à votre numérotation locale.

  1. define('OK', 'OK');
  2. define('KO_MISSINGNUMBER', 'KO_MISSINGNUMBER');
  3. define('KO_BADNUMBER', 'KO_BADNUMBER');
  4. define('KO_MISSINGFILE', 'KO_MISSINGFILE');
  5. define('KO_BADFILE', 'KO_BADFILE');
  6. define('KO_FAXNOTSENT', 'KO_FAXNOTSENT');
  7.  
  8. $errorlist=array();

Définit les codes de retour renvoyés par le service et initialise la liste des erreurs $errorlist.

  1. $to=false;
  2.  
  3. if (isset($_POST['to'])) {
  4.     $to=$_POST['to'];
  5.     preg_match_all('/(\b[\d+]+\b)/', $to, $tolist);
  6.     $to=$tolist[0];
  7. }
  8.  
  9. if (!$to) {
  10.     $errorlist[]=KO_MISSINGNUMBER;
  11. }
  12. else {
  13.     $tellist=array();
  14.     foreach ($to as $tel){
  15.         if (!chkphone($tel)) {
  16.             $errorlist[]=KO_BADNUMBER;
  17.             break;
  18.         }
  19.         $tellist[] = normphone($tel);
  20.     }
  21.  
  22.     $to=array_unique($tellist);
  23. }

Extrait les groupes de chiffres consécutifs de $_POST['to']. Vérifie que tous les groupes de chiffres sont des numéros de téléphone, les normalise et retire les numéros dupliqués. Ajoute l'erreur KO_MISSINGNUMBER à $errorlist si la liste des numéros de téléphone est vide. Ajoute l'erreur KO_BADNUMBER à $errorlist si un numéro est invalide.

  1. $data=false;
  2.  
  3. $maxsize = 200000;
  4. if (!isset($_FILES['document']) or !$_FILES['document']['tmp_name'] or $_FILES['document']['error'] != 0) {
  5.     $errorlist[]=KO_MISSINGFILE;
  6. }
  7. else if ($_FILES['document']['size'] == 0 or $_FILES['document']['size'] > $maxsize) {
  8.     $errorlist[]=KO_BADFILE;
  9. }
  10.  
  11. if (!$errorlist) {
  12.     $tmpdir = '/tmp';
  13.     $filecopy = $tmpdir . '/' . basename( $_FILES['document']['name']);
  14.  
  15.     if (move_uploaded_file($_FILES['document']['tmp_name'], $filecopy))  {
  16.         $data64=@file_get_contents($filecopy);
  17.  
  18.         $data=base64_decode($data64);
  19.         if ($data === false) {
  20.             $errorlist[]=KO_BADFILE;
  21.         }
  22.         /* fax document */
  23.         @unlink($filecopy);
  24.     }
  25.     else {
  26.         $errorlist[]=KO_BADFILE;
  27.     }
  28. }

Extrait le fichier en pièce jointe de $_FILES. Ajoute l'erreur KO_MISSINGFILE à $errorlist si le fichier est manquant ou en cas d'erreur de transfert. Ajoute l'erreur KO_BADFILE à $errorlist si la taille du fichier est invalide. Si aucune erreur n'a été trouvée, copie le fichier transmis dans une zone temporaire et décode son contenu. Envoie le fax. Ajoute KO_FAXNOTSENT à $errorlist en cas d'erreur. Supprime le fichier temporaire. NOTE : Dans cette version de démonstration, le fax n'est pas vraiment envoyé.

Initialise la liste des codes de retour à OK si aucune erreur n'a été rencontré.

  1. header('Content-Type: text/plain');
  2. echo implode(';', $errorlist); // just one line with no newline

Renvoie un document du type text/plain constitué d'une seule ligne de texte contenant un ou plusieurs codes de retour séparés par un ; (POINT-VIRGULE).

  1. function sendhttp($method, $url, $args, $files=false, $base64=false) {

sendhttp accepte 5 arguments : un type de requête, une URL, une liste de paramètres et en option une liste de fichiers dont le contenu peut être transmis encodé en base64.

  1.     $purl = parse_url($url);
  2.     if ($purl === false)
  3.     {
  4.         return false;
  5.     }

Décompose l'URL avec la fonction PHP parse_url. Retourne false si $url est invalide.

  1.     $scheme = isset($purl['scheme']) ? $purl['scheme'] : 'http';
  2.     switch($scheme) {
  3.         case 'https':
  4.             $proto = 'ssl';
  5.             break;
  6.         case 'http':
  7.             $proto = 'tcp';
  8.             break;
  9.         default:
  10.             return false;
  11.     }
  12.     $host = isset($purl['host']) ? $purl['host'] : 'localhost';
  13.     $portnum = isset($purl['portnum']) ? $purl['portnum'] : $scheme == 'https' ? 443 : 80;
  14.     $path = isset($purl['path']) ? $purl['path'] : '';

Extrait les différents composants de l'URL et assigne les valeurs par défaut.

  1.     $user_agent = 'iZend';
  2.  
  3.     $header_string = $content_string = '';
  4.  
  5.     switch ($method) {

Initialise l'en-tête et le corps du document HTTP. Teste le type de requête.

  1.         case 'POST':
  2.             if ($files && is_array($files)) {
  3.                 $boundary = md5(microtime());
  4.                 $content_type = 'multipart/form-data; boundary='.$boundary;
  5.  
  6.                 $content_string = '';
  7.  
  8.                 if ($args && is_array($args)) {
  9.                     foreach ($args as $k => $v) {
  10.                         $content_string .= '--' . $boundary . "\r\n";
  11.                         $content_string .= 'Content-Disposition: form-data; name="' . $k . '"' . "\r\n\r\n" . $v . "\r\n";
  12.                     }
  13.                 }
  14.                 foreach ($files as $k => $v ) {
  15.                     $data = file_get_contents($v['tmp_name']);
  16.                     if ($data === false) {
  17.                         break;
  18.                     }
  19.                     $content_string .= '--' . $boundary . "\r\n";
  20.                     $content_string .= 'Content-Disposition: form-data; name="' . $k . '"; filename="' . $v['name'] . '"' . "\r\n";
  21.                     $content_string .= 'Content-Type: ' . $v['type'] . "\r\n";
  22.                     if ($base64) {
  23.                         $content_string .= 'Content-Transfer-Encoding: base64' . "\r\n\r\n";
  24.                         $content_string .= chunk_split(base64_encode($data)) . "\r\n";
  25.                     }
  26.                     else {
  27.                         $content_string .= 'Content-Transfer-Encoding: binary' . "\r\n\r\n";
  28.                         $content_string .= $data . "\r\n";
  29.                     }
  30.                 }
  31.                 $content_string .= '--' . $boundary . '--'. "\r\n";
  32.             }
  33.             else {
  34.                 $content_type = 'application/x-www-form-urlencoded';
  35.                 if ($args && is_array($args)) {
  36.                     $content_string = http_build_args($args);
  37.                 }
  38.             }
  39.             $content_length = strlen($content_string);
  40.             $header_string="POST $path HTTP/1.0\r\nHost: $host\r\nUser-Agent: $user_agent\r\nContent-Type: $content_type\r\nContent-Length: $content_length\r\nConnection: close\r\n\r\n";
  41.             break;

Si la requête est un POST, si le document à un ou plusieurs fichiers joints, écrit un document de type multipart/form-data, sinon écrit un document de type application/x-www-form-urlencoded. Dans le premier cas, fabrique un corps de document avec une première partie qui définit un séparateur unique puis une séries de parties annexes contenant chacune un des fichiers joints dont le contenu est encodé en base64 si $base64 est à true. Dans le second cas, fabrique un corps de document HTTP contenant les paramètres éventuels de la requêtes proprement formatés avec http_build_args.

  1.         case 'GET':
  2.             if ($args && is_array($args)) {
  3.                 $path .= '?'.http_build_args($args);
  4.             }
  5.             $header_string="GET $path HTTP/1.0\r\nHost: $host\r\nUser-Agent: $user_agent\r\nConnection: close\r\n\r\n";
  6.             break;

Si la requête est un GET, ajoute les paramètres éventuels proprement formatés avec http_build_args après le chemin d'accès, puis fabrique l'en-tête du document HTTP. Le corps du document est vide.

  1.         default:
  2.             return false;
  3.     }

Retourne false si $method n'est pas 'POST' ou 'GET'.

  1.     $socket = @fsockopen($proto.'://'.$host, $portnum);
  2.     if ($socket === false) {
  3.         return false;
  4.     }

Ouvre la connexion avec le serveur. Retourne false en cas d'erreur.

  1.     if (fwrite($socket, $header_string) === false) {
  2.         return false;
  3.     }
  4.     if ($content_string) {
  5.         $content_len = strlen($content_string);
  6.         for ($written = 0; $written < $content_len; $written += $w) {
  7.             $w = fwrite($socket, $written == 0 ? $content_string : substr($content_string, $written));
  8.             if ($w === false) {
  9.                 return false;
  10.             }
  11.         }
  12.     }

Écrit l'en-tête du document puis le corps du document en plusieurs paquets si nécessaire.

  1.     $response = '';
  2.     while (!feof($socket)) {
  3.         $response .= fread($socket, 8192);
  4.     }

Lit la réponse du serveur.

  1.     fclose($socket);

Ferme la connexion avec le serveur.

  1.     list($response_headers, $response_body) = explode("\r\n\r\n", $response, 2);
  2.  
  3.     $response_header_lines = explode("\r\n", $response_headers);
  4.     $http_response_line = array_shift($response_header_lines);
  5.  
  6.     if (preg_match('@^HTTP/[0-9]\.[0-9] ([0-9]{3})@', $http_response_line, $r)) {
  7.         $response_code = $r[1];
  8.     }
  9.     else {
  10.         $response_code = 0;
  11.     }

Divise l'en-tête et le corps de la réponse. Sépare l'en-tête ligne par ligne. Extrait la première ligne de l'en-tête pour en retirer le code de retour.

  1.     $response_header_array = array();
  2.     foreach ($response_header_lines as $header_line) {
  3.         list($header, $value) = explode(': ', $header_line, 2);
  4.         $response_header_array[$header] = $value;
  5.     }

Sauve l'en-tête de la réponse dans un tableau associatif.

  1.     return array($response_code, $response_header_array, $response_body);
  2. }

Retourne un tableau avec le code HTTP renvoyé par le service, l'en-tête MIME du document sous la forme d'un tableau associatif et le contenu brut du corps de la réponse.

  1. function sendget($url, $args) {
  2.     return sendhttp('GET', $url, $args);
  3. }

sendget retourne le résultat de l'appel de sendhttp avec les arguments $url et $args et $method à 'GET'.

  1. function sendpost($url, $args, $files=false, $base64=false ) {
  2.     return sendhttp('POST', $url, $args, $files, $base64);
  3. }

sendpost retourne le résultat de l'appel de sendhttp avec les arguments $url, $args, $files et $base64 et $method à 'POST'.

  1. function http_build_args($args) {
  2.     $args_string = '';
  3.  
  4.     foreach ($args as $name => $value) {
  5.         $args_string .= ($args_string ? '&' : '') . urlencode($name) . '=' . urlencode($value);
  6.     }
  7.  
  8.     return $args_string;
  9. }

http_build_args retourne le tableau associatif $args sous la forme d'une chaine de paramètres d'une URL proprement encodée.

sendhttp
SYNOPSIS

sendhttp( $method, $url, $args, $files=false, $base64=false )

sendget( $url, $args )

sendpost( $url, $args, $files=false, $base64=false )

DESCRIPTION

sendhtpp génère un document HTTP 1.0 en GET ou en POST, le transmet à un serveur HTTP ou HTTPS et retourne le code HTTP, l'en-tête et le corps du document renvoyés par le serveur ou false en cas d'erreur.

$method vaut 'GET' ou 'POST' selon le type de requête attendu par le serveur.

$url adresse le code PHP du serveur qui va analyser le document, effectuer un traitement et retourner un document au format HTTP. $url a le format [proto://]host[:portnum]/path. Mettez proto à 'https' pour transmettre le document en mode sécurisé. host donne le nom ou l'adresse IP du serveur. Si nécessaire, ajoutez portnum pour spécifier un numéro de port différent de 80 ou 443 pour des connexions en HTTP ou HTTPS avec un serveur à l'écoute sur des ports particuliers. path donne le chemin d'accès au code en PHP sur le serveur.

$args contient la liste des paramètres du service appelé sous la forme d'un tableau associatif { 'param1' => val1, ... }. $args permet de passer un ou plusieurs champs directement dans une URL pour une requête HTTP GET ou extraits d'un formulaire HTML pour une requête HTTP POST.

$files contient la liste des fichiers ajoutés en pièces jointes sous la forme d'un tableau associatif { 'docname' => {'name' => 'filename', 'type' => 'mimetype', 'tmp_name' => 'pathname'}, ... }. Ce paramètre est optionnel. Typiquement, il permet de passer un fichier transmis par une balise <input type="file" name="docname"... /> d'un formulaire HTML. Si $base64 est à true, les contenus des fichiers sont encodés en base64.

sendhttp renvoie un tableau contenant le code de retour HTTP, l'en-tête MIME de la réponse ventilée ligne par ligne dans un tableau associatif et le corps brut de la réponse. Si un argument est invalide ou si la connexion a échoué, sendhttp retourne false.

sendget et sendpost appellent sendhttp avec $method respectivement à 'GET' et 'POST'.

EXEMPLE
$ php -a

Démarre l'interprète PHP en mode interactif.

php> $r = sendget('http://www.google.com/search', array('q' => 'frasq.org'));

Equivaut à taper http:://www.google.com/search?q=frasq.org dans la barre d'adresse d'un navigateur.

php> print_r($r[0]);
200

Affiche le code de retour HTTP.

php> print_r($r[1]);
Array
(
    [Date] => ...
    [Expires] => -1
    [Cache-Control] => private, max-age=0
    [Content-Type] => text/html; charset=ISO-8859-1
    ...
)

Affiche l'en-tête MIME du document.

php> echo $r[1]['Content-Type'];
text/html; charset=ISO-8859-1

Affiche le type de contenu du document.

php> print_r($r[2]);
<!doctype html><head><title>frasq.org - Google Search</title> ...

Affiche le document.

Application

Google publie une API pour dessiner des graphiques et d'autres types d'images - Google Charts API. Une fonction permet d'obtenir une image PNG d'un code QR. Passez simplement les paramètres requis dans une <img> :

<img src="http://chart.googleapis.com/chart?cht=qr&chf=&bg,s,ffffff&chs=63x63&chld=M|0&chl=www.frasq.org" />

Pour appeler ce service dans un programme, encapsulez sendhttp dans une fonction spécifique :

  1. require_once 'sendhttp.php';

Charge la fonction sendhttp.

  1. function qrencode($s, $size=100, $quality='M') {
  2.     $url = 'http://chart.googleapis.com/chart';
  3.     $args = array(
  4.         'cht'   => 'qr',
  5.         'chf'   => 'bg,s,ffffff',
  6.         'chs'   => "${size}x${size}",
  7.         'chld'  => "${quality}|0",
  8.         'chl'   => $s,
  9.     );
  10.  
  11.     $response=sendget($url, $args);
  12.  
  13.     if (!$response or $response[0] != 200) {
  14.         return false;
  15.     }
  16.  
  17.     return $response[2];
  18. }

qrencode envoie une requête GET au service à l'adresse http://chart.googleapis.com/chart et retourne les données en binaire d'une image ou false en cas d'erreur. $s contient la chaîne de caractères à encoder. $size est en pixels. $quality peut valoir L, M, Q ou H. Voir la documentation pour plus de détails.

Décoder l'image d'un code QR est plus délicat. Supposez que vous n'ayez pas trouvé une véritable API HTTP mais juste un formulaire qui vous laisse télécharger une image et retourne le texte décodé : ZXing Decoder Online. Essayez-le. Ce formulaire retourne le texte décodé ou un autre document HTML en cas d'erreur.

Extrayez le code source du formulaire :

<form enctype="multipart/form-data" method="post" action="decode">
<p><input name="f" size="50" type="file"/>&nbsp;<input type="submit"/>
<input value="true" name="full" type="hidden"/></p></form>

Écrivez une fonction qui passe ces paramètres dans une requête HTTP du type POST :

  1. function qrdecode($file, $filetype='image/png') {
  2.     $url = 'http://zxing.org/w/decode';
  3.     $args = array(
  4.         'full'  => 'true',
  5.     );
  6.     $files=array('f' => array('name' => basename($file), 'tmp_name' => $file, 'type' => $filetype));
  7.  
  8.     $response=sendpost($url, $args, $files, false); // DON'T encode data in base64
  9.  
  10.     if (!$response or $response[0] != 200) {
  11.         return false;
  12.     }
  13.  
  14.     if (preg_match('#<html>.*</html>#', $response[2])) {
  15.         return false;
  16.     }
  17.    
  18.     return strip_tags($response[2]);
  19. }

qrdecode envoie une requête POST à l'adresse http://zxing.org/w/decode avec un fichier en pièce jointe. Si le service retourne un autre document HTML, qrdecode retourne false.

IMPORTANT : Soyez très prudent lorsque vous insérez des données retournées par un autre programme. Si possible, retirez toutes les balises avec strip_tags et ajoutez votre propre formatage.

Lisez le manuel Écrire un CMS en PHP pour apprendre comment structurer le développement d'un site web.

Commentaires

Votre commentaire :
[p] [b] [i] [u] [s] [quote] [pre] [br] [code] [url] [email] strip aide 2000

Entrez un maximum de 2000 caractères.
Améliorez la présentation de votre texte avec les balises de formatage suivantes :
[p]paragraphe[/p], [b]gras[/b], [i]italique[/i], [u]souligné[/u], [s]barré[/s], [quote]citation[/quote], [pre]tel quel[/pre], [br]à la ligne,
[url]http://www.izend.org[/url], [url=http://www.izend.org]site[/url], [email]izend@izend.org[/email], [email=izend@izend.org]izend[/email],
[code]commande[/code], [code=langage]code source en c, java, php, html, javascript, xml, css, sql, bash, dos, make, etc.[/code].