Я пытаюсь сделать HTTP-запрос от одного из моих контроллеров, чтобы связаться с другим URL-адресом, цель состоит в том, чтобы связаться с другим URL-адресом и просто распечатать ответ HTML на моей странице. Я пытался :
$r = new Request(); $r->create('http://www.google.com', 'GET'); return $this->render(...mytemplate..., array('name' => $r->getContent());
Мой шаблон просто печатает переменную «name».
Теперь, когда я это делаю, ничего не возвращается. Мне кажется, что запрос никогда не отправляется, поэтому ничего не возвращается.
Мой вопрос: как отправить запрос и получить содержание ответа?
Заранее спасибо.
EDIT : Я сделал GremoBuzzBundle для браузера Buzz. Это похоже на SensioBuzzBundle, но у него есть некоторые хорошие параметры конфигурации.
Я бы предложил использовать браузер Buzz и инъекцию зависимости. 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');
Две проблемы.
Прежде всего, это не правильное использование Symfony\Component\HttpFoundation\Request::create()
, которое является статическим инициализатором / фабрикой. Ваш код должен выглядеть так:
$r = Request::create( 'http://www.google.com', 'GET' );
Теперь у вас есть правильный объект Request. Однако это не имеет значения, что является вашей второй проблемой: это не то, как объект запроса Symfony предназначен для работы. Его цель заключается не в выполнении HTTP-запросов, а в том, что они представляют их как объекты в рамках.
Короче говоря, вы не можете так поступать. Возможно, вы можете использовать cURL для очистки страницы, которую хотите?
Почему бы не использовать завиток? Из руководства по 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);
Я бы рекомендовал вам использовать 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
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');
Видимо, вы можете использовать встроенный 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 .