Symfony2中:发送一个HTTP请求(Symfony2 : send a HTTP Reques

2019-07-29 10:43发布

我想从我的控制器联系另一个URL的一个做一个HTTP请求,其目标是到联系另一个URL,并简单地打印HTML答案在我的网页。 我试过了 :

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

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



我的模板简单的打印变量“名”。
现在,当我这样做,什么都不会返回。 在我看来,该请求是永远不会发送,这就是为什么什么都不会返回。

我的问题是:我怎么发送请求并获得响应的内容?

提前致谢。

Answer 1:

编辑 :我做了一个GremoBuzzBundle为巴兹浏览器。 它类似于SensioBuzzBundle但它有一些很不错的配置选项。

我会建议使用巴兹浏览器和依赖注入。 巴斯是围绕卷曲或的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']

第一服务是在客户端(我喜欢包住的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');


Answer 2:

两个问题。

首先,这不是的正确使用Symfony\Component\HttpFoundation\Request::create()这是各种各样的静态初始化/工厂。 您的代码应该是这样的

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

现在你有一个适当的请求对象。 然而,这是无关紧要这是你的第二个问题:这不是Symfony的请求对象是如何设计工作。 它的目的不是用于执行 HTTP请求,它代表他们作为框架的对象。

长话短说,你不能这样做的。 也许你可以使用卷曲刮的页面 ,你想要什么?



Answer 3:

我会用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



Answer 4:

为什么不使用卷曲? 从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);


Answer 5:

显然,你可以使用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

BUT(编辑),这些客户都是本地应用程式。 这里说明的概念是更好的Symfony2的BrowserKit组件实现。 内Symfony的无头的浏览器。

甚至更好,使用GOUTTE的请求与外部网站。 见https://github.com/FriendsOfPHP/Goutte了解详情。



Answer 6:

https://github.com/CircleOfNice/CiRestClientBundle

对于卷曲图书馆使用方便尼斯API,它返回一个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');


文章来源: Symfony2 : send a HTTP Request