Envoyer une requête CURL

Introduction

CURL est une technologie qui permet de faire interagir nos scripts PHP avec des serveurs extérieurs à notre application et supportant différents protocoles dont HTTPS, HTTP et FTP.

Les applications de cette technologie sont nombreuses, dont les principales sont:

  • Web services : permettre à des applications distinctes de dialoguer entres elles.

  • Web scraping : extraction de données sur le web.

Mise en œuvre

La mise en œuvre d’une requête CURL est très simple et suis le schéma suivant :

  • Initialisation : on définit l’adresse URL sur laquelle on envoi la requête.

  • Configuration : on configure notre requête.

  • Exécution.

  • Clôture.

Il y a 2 façons de configurer une requête CURL :

  • En utilisant curl_setopt (mode variable).

  • En utilisant curl_setopt_array (mode array).

Exemples (envoi d’une requête en GET) :

$url = "http://api.machin.com";

$channel = curl_init($url);
curl_setopt($channel, CURLOPT_HEADER, false);
curl_setopt($channel, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($channel, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($channel, CURLOPT_RETURNTRANSFER, true);

$data = curl_exec($channel);
curl_close($channel);
$url = "http://api.machin.com";
$options = [
    CURLOPT_HEADER => false,
    CURLOPT_SSL_VERIFYHOST => false,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_RETURNTRANSFER => true
];

$channel = curl_init($url);
curl_setopt_array($channel, $options);

$data = curl_exec($channel);
curl_close($channel);

Pour envoyer une requête POST, il faut utiliser les options suivant :

  • CURLOPT_POST

  • CURLOPT_POSTFIELDS

Exemple :

$url = "http://api.machin.com";

$postFields = [
    "user" => "identifiant",
    "pass" => "mot de passe"
];

$channel = curl_init($url);
curl_setopt($channel, CURLOPT_HEADER, false);
curl_setopt($channel, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($channel, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($channel, CURLOPT_RETURNTRANSFER, true);
curl_setopt($channel, CURLOPT_POST, true);
curl_setopt($channel, CURLOPT_POSTFIELDS, $postFields);

$data = curl_exec($channel);
curl_close($channel);

Récupérer des informations :

Pour récupérer des informations concernant la communication CURL, on utilise la fonction curl_getinfo().

Pour récupérer toutes les informations

Exemple (Pour récupérer toutes les informations) :

$infos = curl_getinfo($channel);

Exemple (Pour récupérer une information particulière) :

$httpcode = curl_getinfo($channel, CURLINFO_HTTP_CODE);

Les constantes d’options :

Connexion :

  • CURLOPT_URL : URL à utiliser pour établir la connexion (alternative au paramètre url de la fonction curl_init). La forme de celle-ci dépend du protocole employé

  • CURLOPT_TIMEOUT : Temps maximal d’exécution, exprimé en secondes, de la fonction curl_exec

  • CURLOPT_CONNECTTIMEOUT : Durée maximale de la tentative d’établissement de la connexion vers l’hôte distant (en secondes). Une valeur nulle aura pour effet de laisser cette tâche au système

Générales :

  • CURLOPT_NOBODY Fixée à TRUE la partie « contenu » ne sera pas renvoyée. Par exemple avec le protocole HTTP, la requête employée sera de type HEAD au lieu de GET par défaut. Sa valeur par défaut est FALSE, rapatriant ainsi les données distantes

  • CURLOPT_HEADER Suivant le protocole employé, la valeur TRUE permettra d’inclure les en-têtes dans le résultat renvoyé. La valeur par défaut est FALSE

  • CURLOPT_RETURNTRANSFER Avec la valeur TRUE, le contenu de la page distante est retourné sous la forme d’une chaîne par la fonction curl_exec. La valeur par défaut FALSE a pour effet d’en afficher directement la sortie

  • CURLOPT_FILE Un descripteur de fichier (préalablement obtenu et ouvert avec fopen en mode écriture) dans lequel sera alors écrit les données renvoyées par le serveur distant. La valeur par défaut est la sortie standard soit le navigateur dans une utilisation « web » de PHP

  • CURLOPT_UPLOAD Permet d’indiquer, en attribuant la valeur TRUE à cette option, à cURL qu’un envoi de fichier va avoir lieu et qu’il doit s’y préparer

  • CURLOPT_INFILE Un descripteur de fichier, auparavant obtenu et ouvert en lecture par la fonction fopen, duquel les données pour l’upload seront lues

  • CURLOPT_INFILESIZE Taille du fichier qui sera envoyé au serveur distant

Protocole HTTP :

  • CURLOPT_HTTP_VERSION Forcer la version du protocole HTTP utilisée. La valeur par défaut est CURL_HTTP_VERSION_NONE, laissant ainsi le soin à cURL de décider sinon forcez la à l’aide de CURL_HTTP_VERSION_1_0 ou CURL_HTTP_VERSION_1_1 qui correspondent respectivement aux versions 1.0 et 1.1

  • CURLOPT_FOLLOWLOCATION TRUE pour suivre (toutes) les redirections de type « Location: ». On peut toutefois limiter le nombre de celles-ci avec l’option CURLOPT_MAXREDIRS

  • CURLOPT_MAXREDIRS Spécifie le nombre maximum de redirections qui seront suivies avant de faire échouer la requête. Une valeur nulle implique aucune redirection alors que -1 (valeur par défaut) signifie toutes

  • CURLOPT_HTTPGET La méthode HTTP employée sera GET. Il s’agit du type de requête par défaut

  • CURLOPT_POST Définir cette option à la valeur TRUE aura pour effet d’employer la méthode POST à la place de la méthode GET par défaut

  • CURLOPT_POSTFIELDS Les données à envoyer par la méthode POST sous la forme d’une chaîne (doivent être encodées) ou d’un tableau associant le nom du champ à sa valeur. Cette deuxième forme ne nécessite pas l’encodage des données car elle sera réalisée en interne et permet d’envoyer des fichiers en faisant précéder leur nom d’une arobase

  • CURLOPT_USERPWD Permet de fournir un identifiant et un mot de passe pour passer les systèmes d’authentification HTTP. Ils prennent alors la forme login:mot_de_passe

  • CURLOPT_USERAGENT Définit l’en-tête User-Agent (le navigateur) pour la requête HTTP

  • CURLOPT_REFERER Renseigne l’entête Referer, la page d’où on provient en temps normal

  • CURLOPT_AUTOREFERER Avec la valeur TRUE cURL renseignera automatiquement l’en-tête Referer lors de redirections

  • CURLOPT_HTTPHEADER Ensemble d’en-têtes à présenter lors de la requête sous la forme d’un tableau numériquement indexé

  • CURLOPT_COOKIEFILE Indique le fichier duquel seront lues les données relatives aux cookies

  • CURLOPT_COOKIEJAR Fichier où seront écrites les données des différents cookies reçus

  • CURLOPT_COOKIESESSION Si à valeur vraie (vaut faux par défaut), la requête HTTP sur le point d’être exécutée doit initier une nouvelle session. C’est-à-dire que tous les cookies dits de session, soit à valeur d’expiration nul, hérités de précédentes requêtes seront ignorés (et supprimés si l’option CURLOPT_COOKIEJAR est également active).

Protocole FTP :

  • CURLOPT_QUOTE Un tableau numériquement indexé des commandes FTP à exécuter avant notre requête

  • CURLOPT_POSTQUOTE Les commandes FTP à exécuter après notre requête sous la forme d’un tableau numériquement indexé

  • CURLOPT_TRANSFERTEXT Une valeur vraie indique à cURL d’utiliser le mode de transfert appelé ASCII au lieu du mode binaire par défaut. Toutefois, attention : le mode ascii est implémenté de manière incomplète au sein de cURL

  • CURLOPT_FTP_SSL

Permet de spécifier, à l’aide d’une des constantes ci-dessous, le niveau de sécurité des données qui vont transiter :

CURLFTPSSL_NONE : connexion FTP normale, aucun recours à SSL

CURLFTPSSL_TRY : tente d’utiliser SSL ou à défaut le protocole normal

CURLFTPSSL_CONTROL : SSL sera requis sur la connexion de contrôle sinon cURL échouera

CURLFTPSSL_ALL : SSL sera requis à la fois pour la connexion de contrôle ainsi que sur le canal de données

  • CURLOPT_FTPSSLAUTH

Détermine l’ordre des versions du protocole SSL à employer :

CURLFTPAUTH_DEFAULT : laisse à cURL le soin de décider

CURLFTPAUTH_SSL : tente d’utiliser SSL avant TLS

CURLFTPAUTH_TLS : tente d’utiliser TLS avant SSL

Les constantes d’informations :

CURLINFO_EFFECTIVE_URL : dernière URL réelle
CURLINFO_HTTP_CODE : dernier code HTTP reçu
CURLINFO_TOTAL_TIME : durée de la transaction en secondes pour le dernier transfert
CURLINFO_SIZE_UPLOAD : nombre total d’octets envoyés
CURLINFO_SIZE_DOWNLOAD : nombre total d’octets téléchargés
CURLINFO_SPEED_DOWNLOAD : vitesse moyenne de téléchargement
CURLINFO_SPEED_UPLOAD : vitesse moyenne d’envoi

Publié dans PHP

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *