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¶m2=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.
Je suggère d'utiliser CURL:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'www.someapi.com?param1=A¶m2=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.
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");
...
}
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
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();
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
}