web-dev-qa-db-fra.com

Appelez une API REST dans PHP

Notre client m'avait donné une API REST à laquelle je devais appeler PHP. Mais en réalité, la documentation fournie avec l’API est très limitée, je ne sais donc pas comment appeler le service.

J'ai essayé de le rechercher sur Google, mais la seule chose qui a été évoquée était un compte Yahoo! déjà expiré. tutoriel sur la façon d'appeler le service. Ne pas mentionner les en-têtes ou quoi que ce soit d'informations détaillées.

Existe-t-il des informations utiles sur la procédure à suivre pour appeler une API REST ou sur de la documentation à ce sujet? Même dans W3schools, ils ne décrivent que la méthode SOAP. Quelles sont les différentes options pour faire une API de repos en PHP?

283
Michiel

Vous pouvez accéder à toute API REST avec l'extension PHP cURL. 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;
}
391
Christoph Winkler

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, utilisez la classe simple_xml:

$response = new SimpleXMLElement($response);

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

165
Andreas Wong

Utilisez Guzzle . C'est un "client HTTP PHP qui facilite le travail avec HTTP/1.1 et simplifie l'utilisation de services Web". 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
142
colan

CURL est la solution la plus simple. Voici un simple appel

$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);
17
Broncha

Utilisez HTTPFUL

Httpful est une bibliothèque PHP simple, chaînable et lisible, conçue pour rendre HTTP parlant sainement. Il permet aux développeurs de se concentrer sur l’interaction avec les API au lieu de passer au crible les pages set_opt de curl. C’est un client PHP REST idéal.

Httpful comprend ...

  • Support des méthodes HTTP lisibles (GET, PUT, POST, DELETE, HEAD et OPTIONS)
  • En-têtes personnalisés
  • Analyse "intelligente" automatique
  • Sérialisation automatique de la charge utile
  • Authentification de base
  • Autorisation du certificat côté client
  • Demander des "modèles"

Ex.

Envoyez une requête GET. Obtenez automatiquement une réponse JSON analysée.

La bibliothèque remarque le type de contenu JSON dans la réponse et l'analyse automatiquement dans un objet PHP natif.

$uri = "https://www.googleapis.com/freebase/v1/mqlread?query=%7B%22type%22:%22/music/artist%22%2C%22name%22:%22The%20Dead%20Weather%22%2C%22album%22:%5B%5D%7D";
$response = \Httpful\Request::get($uri)->send();

echo 'The Dead Weather has ' . count($response->body->result->album) . " albums.\n";
11
Somnath Muluk

Vous aurez besoin de savoir si l'API REST que vous appelez prend en charge GET ou POST, ou les deux méthodes. Le code ci-dessous est quelque chose qui fonctionne pour moi. J'appelle ma propre API de service Web. Je sais donc déjà ce que l'API prend et ce qu'elle retournera. Il supporte les deux méthodes GET et POST. Les informations moins sensibles sont donc insérées dans la URL (GET), et les informations telles que nom d'utilisateur et mot de passe sont soumises sous forme de variables POST. De plus, tout passe par la connexion HTTPS.

Dans le code de l'API, je code un tableau que je veux renvoyer au format JSON, puis j'utilise simplement PHP commande echo $my_json_variable pour que cette chaîne json soit disponible pour le client.

Comme vous pouvez le constater, mon API renvoie des données JSON, mais vous devez savoir (ou consulter les données renvoyées pour le savoir) en quel format la réponse de l’API est au format.

Voici comment je me connecte à l'API du côté client:

$processed = FALSE;
$ERROR_MESSAGE = '';

// ************* Call API:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.myapi.com/api.php?format=json&action=subscribe&email=" . $email_to_subscribe);
curl_setopt($ch, CURLOPT_POST, 1);// set post data to true
curl_setopt($ch, CURLOPT_POSTFIELDS,"username=myname&password=mypass");   // post data
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$json = curl_exec($ch);
curl_close ($ch);

// returned json string will look like this: {"code":1,"data":"OK"}
// "code" may contain an error code and "data" may contain error string instead of "OK"
$obj = json_decode($json);

if ($obj->{'code'} == '1')
{
  $processed = TRUE;
}else{
  $ERROR_MESSAGE = $obj->{'data'};
}

...

if (!$processed && $ERROR_MESSAGE != '') {
    echo $ERROR_MESSAGE;
}

BTW, j'ai aussi essayé d'utiliser la méthode file_get_contents() comme certains des utilisateurs l'ont suggéré, mais ça ne marche pas bien pour moi. J'ai découvert que la méthode curl était plus rapide et plus fiable.

6
derekg

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

4
deadrunk

Si vous utilisez Symfony, il existe un excellent pack client de repos qui inclut même toutes les ~ 100 exceptions et les jette au lieu de renvoyer un code d'erreur sans signification + message.

Vous devriez vraiment vérifier cela: https://github.com/CircleOfNice/CiRestClientBundle

J'adore l'interface:

try {
    $restClient = new RestClient();
    $response   = $restClient->get('http://www.someUrl.com');
    $statusCode = $response->getStatusCode();
    $content    = $response->getContent();
} catch(OperationTimedOutException $e) {
    // do something
}

Fonctionne pour toutes les méthodes http.

3
Tobias

Vous pouvez utiliser file_get_contents pour émettre n'importe quelle méthode http POST/PUT/DELETE/OPTIONS/HEAD, en plus de la méthode GET, comme le suggère le nom de la fonction.

Comment publier des données dans PHP en utilisant file_get_contents?

2
Chuan Ma

comme @Christoph Winkler l'a mentionné, il s'agit d'une classe de base pour l'atteindre:

curl_helper.php

// This class has all the necessary code for making API calls thru curl library

class CurlHelper {

// This method will perform an action/method thru HTTP/API calls
// Parameter description:
// Method= POST, PUT, GET etc
// Data= array("param" => "value") ==> index.php?param=value
public static function perform_http_request($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;
}

}

Ensuite, vous pouvez toujours inclure le fichier et l'utiliser, par exemple: any.php

    require_once("curl_helper.php");
    ...
    $action = "GET";
    $url = "api.server.com/model"
    echo "Trying to reach ...";
    echo $url;
    $parameters = array("param" => "value");
    $result = CurlHelper::perform_http_request($action, $url, $parameters);
    echo print_r($result)
1
d1jhoni1b

Si vous êtes ouvert à utiliser des outils tiers, vous devriez jeter un coup d'œil à celui-ci: https://github.com/CircleOfNice/DoctrineRestDriver

C'est une manière complètement nouvelle de travailler avec des API.

Tout d'abord, vous définissez une entité qui définit la structure des données entrantes et sortantes et vous l'annotez avec les sources de données:

/*
 * @Entity
 * @DataSource\Select("http://www.myApi.com/products/{id}")
 * @DataSource\Insert("http://www.myApi.com/products")
 * @DataSource\Select("http://www.myApi.com/products/update/{id}")
 * @DataSource\Fetch("http://www.myApi.com/products")
 * @DataSource\Delete("http://www.myApi.com/products/delete/{id}")
 */
class Product {
    private $name;

    public function setName($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

Maintenant, il est assez facile de communiquer avec l'API REST:

$product = new Product();
$product->setName('test');
// sends an API request POST http://www.myApi.com/products ...
$em->persist($product);
$em->flush();

$product->setName('newName');
// sends an API request UPDATE http://www.myApi.com/products/update/1 ...
$em->flush();
1
Tobias

Vous pouvez utiliser POSTMAN, une application qui simplifie les API. Remplissez les champs de demande et ensuite il générera du code pour vous dans différentes langues. Cliquez simplement sur le code à droite et sélectionnez votre langue préférée.

0
xhuljo