394 votes

Appeler une API REST en PHP

Notre client m'a fourni une API REST à laquelle je dois faire un appel en PHP. Mais en fait, la documentation fournie avec l'API est très limitée, donc je ne sais pas vraiment comment appeler le service.

J'ai essayé de le chercher sur Google, mais la seule chose qui est apparue était un tutoriel Yahoo ! déjà expiré sur la façon d'appeler le service. Il ne mentionne pas les en-têtes ou toute autre information approfondie.

Existe-t-il des informations décentes sur la manière d'appeler une API REST, ou de la documentation à ce sujet ? Parce que même sur W3schools, ils ne décrivent que la méthode SOAP. Quelles sont les différentes options pour créer une API REST en PHP ?

532voto

Christoph Winkler Points 1275

Vous pouvez accéder à n'importe quelle API REST avec PHPs cURL Extension. Cependant, la documentation de l'API (méthodes, paramètres, etc.) doit être fournie par votre client !

Exemple :

// Method: POST, PUT, GET etc
// Data: array("param" => "value") ==> index.php?param=value

function CallAPI($method, $url, $data = false)
{
    $curl = curl_init();

    switch ($method)
    {
        case "POST":
            curl_setopt($curl, CURLOPT_POST, 1);

            if ($data)
                curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            break;
        case "PUT":
            curl_setopt($curl, CURLOPT_PUT, 1);
            break;
        default:
            if ($data)
                $url = sprintf("%s?%s", $url, http_build_query($data));
    }

    // Optional Authentication:
    curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($curl, CURLOPT_USERPWD, "username:password");

    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

    $result = curl_exec($curl);

    curl_close($curl);

    return $result;
}

0 votes

D'après ce que je peux voir dans la documentation, ils sont fournis. Auriez-vous de la documentation à ce sujet ?

0 votes

Merci Christoph, mais où dois-je placer les en-têtes d'authentification ?

0 votes

@Michiel J'ai mis à jour mon exemple avec une authentification de base. Voir la section Paramètres pour curl_setopt pour les autres options d'authentification.

238voto

SiGanteng Points 23915

Si vous avez une url et que votre php le supporte, vous pouvez simplement appeler file_get_contents :

$response = file_get_contents('http://example.com/path/to/api/call?param1=5');

si $response est JSON, utilisez json_decode pour le transformer en tableau php :

$response = json_decode($response);

si $response est XML, utiliser la classe simple_xml :

$response = new SimpleXMLElement($response);

http://sg2.php.net/manual/en/simplexml.examples-basic.php

36 votes

Si le point de terminaison REST renvoie un statut d'erreur HTTP (par exemple, 401), la fonction file_get_contents échoue avec un avertissement et renvoie null. Si le corps contient un message d'erreur, vous ne pouvez pas le récupérer.

4 votes

Son principal inconvénient est que votre installation PHP doit avoir activé les wrappers fopen pour pouvoir accéder aux URL. Si les wrappers fopen ne sont pas activés, vous ne pourrez pas utiliser file_get_contents pour les demandes de services Web.

2 votes

Les wrappers fopen font partie des parties de PHP considérées comme une vulnérabilité, et vous verrez probablement certains hôtes les désactiver.

188voto

colan Points 284

Utilisez Guzzle . Il s'agit d'un "client PHP HTTP qui facilite l'utilisation de HTTP/1.1 et rend la consommation de services Web moins pénible". Travailler avec Guzzle est beaucoup plus facile que de travailler avec cURL.

Voici un exemple tiré du site Web :

$client = new GuzzleHttp\Client();
$res = $client->get('https://api.github.com/user', [
    'auth' =>  ['user', 'pass']
]);
echo $res->getStatusCode();           // 200
echo $res->getHeader('content-type'); // 'application/json; charset=utf8'
echo $res->getBody();                 // {"type":"User"...'
var_export($res->json());             // Outputs the JSON decoded data

29 votes

Ceux qui utilisent encore cURL n'ont jamais examiné de près cette option.

1 votes

Cela semble bien. Mais qu'en est-il de la récupération des PNGs ? Pour les tuiles de la carte. Je ne trouve que les données JSON mentionnées sur la page web que vous avez indiquée.

0 votes

@HenrikErlandsson, une recherche rapide sur Google a révélé ce qui semble être une solution décente. stackoverflow.com/questions/55881436/

31voto

Broncha Points 2151

La méthode CURL est la plus simple à mettre en œuvre. Voici un appel simple

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "THE URL TO THE SERVICE");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, POST DATA);
$result = curl_exec($ch);

print_r($result);
curl_close($ch);

5voto

deadrunk Points 3902

Il y a beaucoup de clients en fait. L'un d'eux est Nuisibles - regardez ça. Et gardez à l'esprit que ces appels REST sont de simples requêtes http avec différentes méthodes : GET, POST, PUT et DELETE.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X