Подтвердить что ты не робот

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 должен сделать это сам.

4b9b3361

Ответ 1

Я бы предложил использовать 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. Там может быть пакет, который может упростить этот процесс для вас, но если есть, я не знаю об этом.

Ответ 2

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

    ...
}

Ответ 3

Лучший клиент, которого я знаю: 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

Ответ 4

https://github.com/sensio/SensioBuzzBundle кажется тем, что вы ищете.

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

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

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

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

echo $response->getContent();

Ответ 5

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
}