PHP
Appeler une API REST avec cURL : délais, erreurs et journalisation
Fiche écrite en 2020, pour les navigateurs et les versions de l’époque. Vérifiez qu’elle correspond encore à votre environnement avant de l’appliquer.
La plupart des connecteurs qui posent problème en production ont le même défaut : un appel cURL écrit en cinq lignes, sans délai maximal, dont le résultat n’est jamais vérifié. Le jour où l’API répond lentement, la page du site attend avec elle ; le jour où elle renvoie une erreur, personne ne le sait. Voici la fonction que je réutilise, à adapter à l’authentification de l’API visée.
<?php
function appelApi(string $methode, string $url, array $donnees = null, string $jeton = ''): array
{
$entetes = ['Accept: application/json'];
if ($jeton !== '') {
$entetes[] = 'Authorization: Bearer ' . $jeton;
}
if ($donnees !== null) {
$entetes[] = 'Content-Type: application/json';
}
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CUSTOMREQUEST => $methode,
CURLOPT_CONNECTTIMEOUT => 5, // établir la connexion
CURLOPT_TIMEOUT => 20, // durée totale de l'échange
CURLOPT_HTTPHEADER => $entetes,
]);
if ($donnees !== null) {
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($donnees));
}
$reponse = curl_exec($ch);
$code = (int) curl_getinfo($ch, CURLINFO_HTTP_CODE);
$erreur = curl_error($ch);
curl_close($ch);
if ($reponse === false) {
throw new RuntimeException("$methode $url : échec réseau ($erreur)");
}
if ($code >= 400) {
throw new RuntimeException("$methode $url : HTTP $code " . substr($reponse, 0, 300));
}
$json = json_decode($reponse, true);
return is_array($json) ? $json : [];
}
À l’usage, l’appel est entouré d’un try et chaque échec laisse une ligne lisible dans le journal PHP, avec la méthode, l’adresse et le début de la réponse. C’est ce qui permet, trois semaines plus tard, de comprendre pourquoi une commande n’est jamais arrivée dans l’ERP. Une règle absolue : ne jamais désactiver CURLOPT_SSL_VERIFYPEER pour « faire marcher » un appel. Si le certificat est refusé, c’est le magasin de certificats du serveur qu’il faut mettre à jour.
try {
$commande = appelApi('GET', 'https://api.exemple-erp.fr/v1/commandes/' . rawurlencode($reference), null, $jeton);
} catch (RuntimeException $e) {
error_log('[connecteur-erp] ' . $e->getMessage());
// décider ici : réessayer plus tard, alerter, ou passer à la suite
}
Sources
- PHP, curl_setopt() php.net