Symfony2:发送HTTP请求

Gab*_*ron 13 html php http httprequest symfony

我正在尝试从我的一个控制器发出HTTP请求以联系另一个URL,目标是联系另一个URL,并在我的页面中打印HTML答案.我试过了 :

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

return $this->render(...mytemplate..., array('name' => $r->getContent());
Run Code Online (Sandbox Code Playgroud)



我的模板只是打印变量"name".
现在,当我这样做时,没有任何回报.在我看来,请求永远不会被发送,这就是为什么没有返回.

我的问题是:如何发送请求并获取响应内容?

提前致谢.

gre*_*emo 18

编辑:我为Buzz浏览器制作了一个GremoBuzzBundle.它与SensioBuzzBundle类似,但它有一些不错的配置选项.

我建议使用Buzz浏览器和依赖注入.Buzz是cURL或file_get_contents的包装器.编辑deps添加以下行的文件:

[Buzz]
    git=https://github.com/kriswallsmith/Buzz.git
    target=/buzz
Run Code Online (Sandbox Code Playgroud)

然后安装供应商以实际下载库:

php bin/vendors install
Run Code Online (Sandbox Code Playgroud)

然后添加两个服务(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']
Run Code Online (Sandbox Code Playgroud)

第一个服务是客户端(我更喜欢cURL而不是file_get_contents),后者是浏览器本身.最后一步是在autoloader(app/autoload.php)中添加一行代码:

$loader->registerNamespaces(array(
    'Buzz' => __DIR__.'/../vendor/buzz/lib',
));
Run Code Online (Sandbox Code Playgroud)

然后,您可以在控制器代码中获取服务并使用浏览器:

$browser = $this->get('buzz.browser');
$response = $browser->get('http://www.google.com');
Run Code Online (Sandbox Code Playgroud)


Pet*_*ley 17

两个问题.

首先,这不是正确的用法Symfony\Component\HttpFoundation\Request::create(),它是各种静态初始化器/工厂.您的代码应如下所示

$r = Request::create( 'http://www.google.com', 'GET' );
Run Code Online (Sandbox Code Playgroud)

现在你有了一个合适的Request对象.然而,这是无关紧要的,这是你的第二个问题:这不是Symfony的请求对象的设计工作方式.它的目的不是执行 HTTP请求,而是将它们表示为框架中的对象.

长话短说,你不能这样做.也许您可以使用cURL来抓取您想要的页面


Kam*_*nek 9

我建议你使用GuzzleHttp客户端 - 我知道的最好的客户端: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();
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请访问:http://docs.guzzlephp.org/en/latest/index.html


kor*_*ral 8

为什么不使用卷曲?从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);
Run Code Online (Sandbox Code Playgroud)