web-dev-qa-db-fra.com

Symfony2 - Comment effectuer une requête externe

En utilisant Symfony2, j'ai besoin d'accéder à une API externe basée sur HTTPS.

Comment puis-je appeler un URI externe et gérer la réponse pour "jouer" avec lui. Par exemple, pour afficher un message de réussite ou d'échec?

Je pense à quelque chose comme (notez que performRequest est une méthode complètement inventée):

$response = $this -> performRequest("www.someapi.com?param1=A&param2=B");

if ($response -> getError() == 0){
    // Do something good
}else{
    // Do something too bad
}

J'ai lu sur Buzz et d'autres clients. Mais je suppose que Symfony2 devrait être capable de le faire par ses propres moyens.

26
ElPiter

Je suggère d'utiliser CURL:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'www.someapi.com?param1=A&param2=B');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/json')); // Assuming you're requesting JSON
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$response = curl_exec($ch);

// If using JSON...
$data = json_decode($response);

Remarque: Le php sur votre serveur Web doit avoir le php5-curl bibliothèque installée.

En supposant que la demande d'API renvoie des données JSON, cette page peut être utile.

Cela n'utilise aucun code spécifique à Symfony2. Il y a peut-être un bundle qui peut simplifier ce processus pour vous, mais s'il y en a je n'en sais rien.

33
RobMasters

Symfony n'a pas de service intégré pour cela, mais c'est une occasion parfaite de créer le vôtre, en utilisant le framework d'injection de dépendances. Ce que vous pouvez faire ici, c'est écrire un service pour gérer l'appel externe. Appelons le service "http".

Tout d'abord, écrivez une classe avec une méthode performRequest():

namespace MyBundle\Service;

class Http
{    
    public function performRequest($siteUrl)
    {
        // Code to make the external request goes here
        // ...probably using cUrl
    }
}

Enregistrez-le en tant que service dans app/config/config.yml:

services:
    http:
        class: MyBundle\Service\Http

Votre contrôleur a maintenant accès à un service appelé "http". Symfony gère une seule instance de cette classe dans le "conteneur", et vous pouvez y accéder via $this->get("http"):

class MyController
{
    $response = $this->get("http")->performRequest("www.something.com");

    ...
}
27
Thomas Kelley

Le meilleur client que je connaisse est: http://docs.guzzlephp.org/en/latest/

Il existe déjà un bundle qui l'intègre dans le projet Symfony2: https://github.com/8p/GuzzleBundle

$client   = $this->get('guzzle.client');

// send an asynchronous request.
$request = $client->createRequest('GET', 'http://httpbin.org', ['future' => true]);
// callback
$client->send($request)->then(function ($response) {
    echo 'I completed! ' . $response;
});

// optional parameters
$response = $client->get('http://httpbin.org/get', [
    'headers' => ['X-Foo-Header' => 'value'],
    'query'   => ['foo' => 'bar']
]);
$code = $response->getStatusCode();
$body = $response->getBody();

// json response
$response = $client->get('http://httpbin.org/get');
$json = $response->json();

// extra methods
$response = $client->delete('http://httpbin.org/delete');
$response = $client->head('http://httpbin.org/get');
$response = $client->options('http://httpbin.org/get');
$response = $client->patch('http://httpbin.org/patch');
$response = $client->post('http://httpbin.org/post');
$response = $client->put('http://httpbin.org/put');

Plus d'informations peuvent être trouvées sur: http://docs.guzzlephp.org/en/latest/index.html

12
Kamil Adryjanek

https://github.com/sensio/SensioBuzzBundle semble être ce que vous recherchez.

Il implémente la bibliothèque de buzz Kris Wallsmith pour effectuer des requêtes HTTP.

Je vous laisse lire le doc sur la page github, l'utilisation est assez basique:

$buzz = $this->container->get('buzz');

$response = $buzz->get('http://google.com');

echo $response->getContent();
10
SebScoFr

Symfony n'a pas son propre client de repos, mais comme vous l'avez déjà mentionné, il y a quelques bundles. Celui-ci est mon préféré:

https://github.com/CircleOfNice/CiRestClientBundle

$restClient = $this->container->get('ci.restclient');

$restClient->get('http://www.someUrl.com');
$restClient->post('http://www.someUrl.com', 'somePayload');
$restClient->put('http://www.someUrl.com', 'somePayload');
$restClient->delete('http://www.someUrl.com');
$restClient->patch('http://www.someUrl.com', 'somePayload');

$restClient->head('http://www.someUrl.com');
$restClient->options('http://www.someUrl.com', 'somePayload');
$restClient->trace('http://www.someUrl.com');
$restClient->connect('http://www.someUrl.com');

Vous envoyez la demande via

$response = $restclient->get($url); 

et obtenez un objet de réponse Symfony. Ensuite, vous pouvez obtenir le code d'état via

$httpCode = $response-> getStatusCode();

Votre code ressemblerait à:

$restClient = $this->container->get('ci.restclient');
if ($restClient->get('http://www.yourUrl.com')->getStatusCode !== 200) {
    // no error
} else {
    // error
}
3
Tobias