Intereting Posts
Недействительные параметры SOS для последовательного JPEG Кажется, не может загрузиться CSV с использованием PHP Curl, когда ответ является содержимым: вложение Скорость PHP против JavaScript? Как извлечь весь текст из XML-данных с помощью PHP (например, SimpleXmlElement)? MySQL пропускает первую строку Лучшее решение для удаления повторяющихся значений из массива без учета регистра Являются ли математические функции в MySQL быстрее PHP? Я хочу создать страницу поиска, где я хочу отображать найденные данные из базы данных в «div»? Хорошо ли иметь BaseController и заставить все контроллеры расширять этот класс? Правильный формат запросов PDO и MySQL IN / NOT IN Что такое «$$» в PHP? Получить insert_id для всех строк, вставленных в один запрос mysqli (несколько значений) Необычная ошибка «Заголовки уже отправлены». Отсутствие пробелов или изменение заголовка Калькулятор Codeigniter, откуда берутся эти ms? Не работает

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».
Теперь, когда я это делаю, ничего не возвращается. Мне кажется, что запрос никогда не отправляется, поэтому ничего не возвращается.

Мой вопрос: как отправить запрос и получить содержание ответа?

Заранее спасибо.

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 .