Symfony2 – Как выполнить внешний запрос

Используя Symfony2, мне нужно получить доступ к внешнему API на основе HTTPS.

Как я могу вызвать внешний URI и управлять ответом на «играть» с ним. Например, чтобы сделать успешное или сообщение об ошибке?

Я думаю в чем-то вроде (обратите внимание, что performRequest – полностью изобретенный метод):

$response = $this -> performRequest("www.someapi.com?param1=A&param2=B"); if ($response -> getError() == 0){ // Do something good }else{ // Do something too bad } 

Я читал о Buzz и других клиентах. Но я предполагаю, что Symfony2 должен иметь возможность сделать это самостоятельно.

Solutions Collecting From Web of "Symfony2 – Как выполнить внешний запрос"

Я бы предложил использовать 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); 

Примечание . Php на вашем веб-сервере должен иметь установленную библиотеку php5-curl .

Предполагая, что запрос API возвращает данные JSON, эта страница может быть полезна.

Это не использует код, специфичный для Symfony2. Там может быть пакет, который может упростить этот процесс для вас, но если есть, я не знаю об этом.

У Symfony нет встроенного сервиса для этого, но это прекрасная возможность создать свою собственную, используя инфраструктуру инъекций зависимостей. Здесь вы можете написать службу для управления внешним вызовом. Назовем услугу «http».

Сначала напишите класс с performRequest() :

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

Зарегистрируйте его как услугу в app/config/config.yml :

 services: http: class: MyBundle\Service\Http 

Теперь ваш контроллер имеет доступ к службе под названием «http». Symfony управляет одним экземпляром этого класса в «контейнере», и вы можете получить к нему доступ через $this->get("http") :

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

Лучший клиент, которого я знаю, это: http://docs.guzzlephp.org/en/latest/

Уже есть пакет, который интегрирует его в проект 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'); 

Более подробную информацию можно найти по адресу : http://docs.guzzlephp.org/en/latest/index.html

https://github.com/sensio/SensioBuzzBundle – это то, что вы ищете.

Он реализует библиотеку Buzz Kris Wallsmith для выполнения HTTP-запросов.

Я дам вам прочитать документ на странице github, использование довольно простое:

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

У Symfony нет собственного клиента для отдыха, но, как вы уже упоминали, есть несколько пакетов. Это мой предпочтительный вариант:

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'); 

Вы отправляете запрос через

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

и получить объект ответа Symfony. Затем вы можете получить код состояния через

 $httpCode = $response-> getStatusCode(); 

Ваш код будет выглядеть так:

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