Вопрос по html, httprequest, http, php, symfony – Symfony2: отправить HTTP-запрос

13

Я пытаюсь сделать HTTP-запрос от одного из моих контроллеров, чтобы связаться с другим URL, цель состоит в том, чтобы связаться с другим URL, и просто напечатать ответ HTML на моей странице. Я старался :

$r = new Request();
$r->create('http://www.google.com', 'GET');

return $this->render(...mytemplate..., array('name' => $r->getContent());



Мой шаблон просто печатает переменную & quot; имя & quot ;.
Теперь, когда я это делаю, ничего не возвращается. Мне кажется, что запрос никогда не отправляется, поэтому ничего не возвращается.

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

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

Ваш Ответ

6   ответов
17

Две проблемы.

Прежде всего, это неправильное использованиеSymfony\Component\HttpFoundation\Request::create(), который является статическим инициализатором / фабрикой сортов. Ваш код должен выглядеть так

$r = Request::create( 'http://www.google.com', 'GET' );

Теперь у вас есть правильный объект запроса. Однако это не имеет значения, что является вашей второй проблемой: это не то, как объект запроса Symfony предназначен для работы. Его цель не дляexecuting HTTP-запросы, его дляrepresenting их как объекты в рамках.

Короче говоря, вы не можете сделать это таким образом. Возможно, вы можетеиспользуйте cURL, чтобы очистить страницу ты хочешь?

Error: User Rate Limit Exceeded Gabriel Theron
Error: User Rate Limit Exceeded
3

Очевидно, вы можете использовать встроенный 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 );

? & GT;

У вас также есть подробный пример HTTP-клиента для Symfony2 как часть документации по модульному тестированию. Увидеть:http://symfony.com/doc/current/book/testing.html

BUT (edit) эти клиенты являются локальными для вашего приложения. Представленные здесь концепции лучше реализуются с помощью компонента BrowserKit Symfony2. Безголовый браузер в Symfony.

Более того, используйте Goutte для запросов на внешние сайты. Увидетьhttps://github.com/FriendsOfPHP/Goutte для деталей.

8

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

Error: User Rate Limit Exceeded Gabriel Theron
18

EDIT: Я сделалGremoBuzzBundle для браузера Buzz. Это похоже наSensioBuzzBundle но у него есть несколько хороших опций конфигурации.

Я бы предложил использоватьБазз браузер и внедрение зависимости. Buzz является оберткой вокруг cURL или file_get_contents. Отредактируйте свойdeps файл, добавляющий эти строки:

[Buzz]
    git=https://github.com/kriswallsmith/Buzz.git
    target=/buzz

Затем установите поставщиков, чтобы фактически загрузить библиотеку:

php bin/vendors install

Затем добавьтеtwo services (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), последний - сам браузер. Последний шаг - добавить одну строку кода вautoloader (app/autoload.php):

$loader->registerNamespaces(array(
    'Buzz' => __DIR__.'/../vendor/buzz/lib',
));

Тогда вы можете получить услугу и использовать браузер в своемcontroller код:

$browser = $this->get('buzz.browser');
$response = $browser->get('http://www.google.com');
Error: User Rate Limit Exceeded Gabriel Theron
Error: User Rate Limit Exceededvendos/buzz/lib/Buzz/Client/Curl.php
Error: User Rate Limit Exceeded Gabriel Theron
Error: User Rate Limit ExceededdepsError: User Rate Limit Exceededsrc/Company/YourBundle/Resources/config/services.ymlError: User Rate Limit Exceededapp/autoload.php.
Error: User Rate Limit Exceeded Gabriel Theron
3

https://github.com/CircleOfNice/CiRestClientBundle

Хороший 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');
8

Почему бы не использовать 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);
Error: User Rate Limit Exceeded Gabriel Theron
Error: User Rate Limit Exceeded

Похожие вопросы