Symfony2: отправьте запрос HTTP
Я пытаюсь сделать HTTP-запрос от одного из моих контроллеров, чтобы связаться с другим URL-адресом, целью которого является связаться с другим URL-адресом и просто распечатать ответ HTML на моей странице.
Я пробовал:
$r = new Request();
$r->create('http://www.google.com', 'GET');
return $this->render(...mytemplate..., array('name' => $r->getContent());
Мой шаблон просто печатает переменную "name".
Теперь, когда я это делаю, ничего не возвращается. Мне кажется, что запрос никогда не отправляется, поэтому ничего не возвращается.
Мой вопрос: как отправить запрос и получить содержание ответа?
Спасибо заранее.
Ответы
Ответ 1
EDIT. Я создал GremoBuzzBundle для браузера Buzz. Он похож на SensioBuzzBundle, но у него есть некоторые хорошие параметры конфигурации.
Я бы предложил использовать Buzz browser и инъекцию зависимости. Buzz - обертка вокруг cURL или file_get_contents. Измените файл deps
, добавив следующие строки:
[Buzz]
git=https://github.com/kriswallsmith/Buzz.git
target=/buzz
Затем установите поставщиков для фактической загрузки библиотеки:
php bin/vendors install
Затем добавьте две службы (src/YourCompany/YourBundle/Resources/config/services.yml
):
# cURL client for Buzz
buzz.client.curl:
class: Buzz\Client\Curl
public: false
calls:
- [setVerifyPeer, [false]]
# Buzz browser
buzz.browser:
class: Buzz\Browser
arguments: ['@buzz.client.curl']
Первой услугой является клиент (я предпочитаю cURL поверх file_get_contents), последний - сам браузер. Последний шаг - добавить одну строку кода в автозагрузчик (app/autoload.php
):
$loader->registerNamespaces(array(
'Buzz' => __DIR__.'/../vendor/buzz/lib',
));
Затем вы можете получить услугу и пользователя браузера в коде контроллера:
$browser = $this->get('buzz.browser');
$response = $browser->get('http://www.google.com');
Ответ 2
Две проблемы.
Прежде всего, это не правильное использование Symfony\Component\HttpFoundation\Request::create()
, которое является статическим инициализатором /factory. Ваш код должен выглядеть следующим образом:
$r = Request::create( 'http://www.google.com', 'GET' );
Теперь у вас есть правильный объект Request. Однако это не имеет значения, что является вашей второй проблемой: это не то, как объект запроса Symfony предназначен для работы. Его цель заключается не в выполнении HTTP-запросов, а в том, что они представляют их как объекты в рамках.
Короче говоря, вы не можете так поступать. Возможно, вы можете использовать cURL для очистки страницы, которую хотите?
Ответ 3
Почему бы не использовать завиток? Из руководство по PHP
$ch = curl_init("http://www.example.com/");
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_HEADER, 0);
result = curl_exec($ch);
curl_close($ch);
Ответ 4
Я бы рекомендовал вам использовать GuzzleHttp Client - лучший клиент, которого я знаю: http://docs.guzzlephp.org/en/latest/
Уже есть хороший пакет, который интегрирует его в проект Symfony2:
https://github.com/8p/GuzzleBundle
Затем с вашего контроллера вы можете позвонить:
$client = $this->get('guzzle.client');
// GET request with parameters
$response = $client->get('http://httpbin.org/get', [
'headers' => ['X-Foo-Header' => 'value'],
'query' => ['foo' => 'bar']
]);
$code = $response->getStatusCode();
$body = $response->getBody();
Дополнительная информация может быть найдена на: http://docs.guzzlephp.org/en/latest/index.html
Ответ 5
https://github.com/CircleOfNice/CiRestClientBundle
Nice API для удобного использования библиотеки curl и возвращает ответ symfony вместо строкового результата
$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');
Ответ 6
По-видимому, вы можете использовать встроенный HTTP-клиент Symfony. Видеть:
http://api.symfony.com/2.0/Symfony/Component/HttpKernel.html
Ниже приведена очень грубая база кода, использующая Silex (построенная поверх Symfony). Он просто создает новый HTTP-клиент.
<?php
require_once __DIR__ . '/silex/vendor/autoload.php';
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\HttpKernel\Controller\ControllerResolver;
use Symfony\Component\HttpKernel\HttpKernel;
use Symfony\Component\HttpKernel\Client;
//use Symfony\Component\HttpFoundation\Response;
$dispatcher = new EventDispatcher();
$resolver = new ControllerResolver();
$kernel = new HttpKernel( $dispatcher, $resolver );
$client = new Client( $kernel );
var_dump( $client );
? >
У вас также есть подробный пример HTTP-клиента для Symfony2 как часть документации по тестированию устройства. См.: http://symfony.com/doc/current/book/testing.html
НО (изменить) эти клиенты являются локальными для вашего приложения. Представленные здесь концепции лучше реализуются с помощью компонента BrowserKit Symfony2. Безголовый браузер в Symfony.
Лучше даже, используйте Goutte для запросов на внешние веб-сайты. Подробнее см. https://github.com/FriendsOfPHP/Goutte.