Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Symfony2 : send a HTTP Request

I am trying to make a HTTP Request from one of my controller to contact another URL, the goal being to contact another URL, and to simply print the HTML answer in my page. I tried :

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

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



My template is simply printing the variable "name".
Now when I do that, nothing is returned. It seems to me that the request is never sent, which is why nothing is returned.

My question is : how do I send the request and get the content of the response?

Thanks in advance.

like image 673
Gabriel Theron Avatar asked May 16 '12 13:05

Gabriel Theron


4 Answers

Two problems.

First of all, that's not the proper usage of Symfony\Component\HttpFoundation\Request::create(), which is a static initializer/factory of sorts. Your code should look like this

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

Now you have a proper Request object. However, this is irrelevant which is your second problem: that's not how Symfony's request object is designed to work. Its purpose is not for executing HTTP requests, its for representing them as objects in the framework.

Long story short, you can't do it that way. Perhaps you can use cURL to scrape the page you want?

like image 88
Peter Bailey Avatar answered Oct 23 '22 02:10

Peter Bailey


I would recommend you using GuzzleHttp Client - best client that I know: http://docs.guzzlephp.org/en/latest/

There is already nice bundle that integrates it into Symfony2 project: https://github.com/8p/GuzzleBundle

Then from your controller you can call:

$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();

More info can be found on: http://docs.guzzlephp.org/en/latest/index.html

like image 37
Kamil Adryjanek Avatar answered Oct 23 '22 03:10

Kamil Adryjanek


EDIT: I made a GremoBuzzBundle for Buzz browser. It's similar to SensioBuzzBundle but it has some nice configuration options.

I would suggest to use Buzz browser and dependency injection. Buzz is a wrapper around cURL or file_get_contents. Edit your deps file adding these lines:

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

Then install vendors to actually download the library:

php bin/vendors install

Then add 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']

The first service is the client (i prefer cURL over file_get_contents), the latter is the browser itself. The last step is to add one line of code in the autoloader (app/autoload.php):

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

Then you can get the service and user the browser in your controller code:

$browser = $this->get('buzz.browser');
$response = $browser->get('http://www.google.com');
like image 18
gremo Avatar answered Oct 23 '22 03:10

gremo


Why not use curl? From PHP manual

$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);
like image 8
koral Avatar answered Oct 23 '22 03:10

koral