13

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

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

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



我的模板只是打印变量“名称”。
现在,当我这样做时,什么都没有返回。在我看来,该请求从未发送过,这就是为什么没有返回任何内容的原因。

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

提前致谢。

4

6 回答 6

18

两个问题。

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

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

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

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

于 2012-05-16T14:06:34.003 回答
18

编辑:我为 Buzz 浏览器制作了一个GremoBuzzBundle 。它类似于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');
于 2012-05-16T14:28:43.807 回答
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();

可以在以下位置找到更多信息:http ://docs.guzzlephp.org/en/latest/index.html

于 2015-03-22T11:28:37.063 回答
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);
于 2012-05-16T14:05:57.757 回答
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');
于 2015-03-22T00:06:02.407 回答
3

显然,您可以使用 Symfony 的内置 HTTP 客户端。见: 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 );

?>

作为单元测试文档的一部分,您还有一个用于 Symfony2 的 HTTP 客户端的详细示例。请参阅:http ://symfony.com/doc/current/book/testing.html

但是(编辑)这些客户端在您的应用程序中是本地的。这里展示的概念可以更好地使用 Symfony2 的 BrowserKit 组件来实现。Symfony 中的无头浏览器。

更好的是,使用 Goutte 请求外部网站。有关详细信息,请参阅https://github.com/FriendsOfPHP/Goutte

于 2014-09-22T11:47:30.037 回答