2012-05-16 216 views
13

我试图从我的控制器之一发出一个HTTP请求来联系另一个URL,目标是联系另一个URL,并简单地在我的页面中打印HTML答案。 我想:Symfony2:发送HTTP请求



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

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

在此先感谢。

回答

18

编辑:我为Buzz浏览器制作了GremoBuzzBundle。它类似于SensioBuzzBundle,但它有一些很好的配置选项。

我建议使用Buzz browser和依赖注入。 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 over 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'); 
+1

我应该编辑哪些依赖项?它是routing.yml还是别的?我有点迷失在这里:/ 无论如何感谢您的答案,这真的很有帮助! –

+0

@GabrielTheron首先'deps'文件,然后是'src/Company/YourBundle/Resources/config/services.yml'(用于服务)和'app/autoload.php'。 – gremo

+0

当我尝试加载页面时出现错误。它说:“没有扩展能够加载配置”buzz.client.curl“”和“查找名称空间”buzz.client.curl“,找不到”。任何想法来自哪里? –

8

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

我会考虑它,但不会要求我写到一个文件? –

+0

不,curl的结果是一个字符串值。 – Acyra

15

两个问题。

首先,这不是Symfony\Component\HttpFoundation\Request::create()的正确用法,这是一个静态初始化/工厂的排序。你的代码应该看起来像这样

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

现在你有一个合适的Request对象。然而,这是无关紧要的,这是你的第二个问题:这不是Symfony的请求对象设计工作的方式。它的目的不是为执行 HTTP请求,它的代表它们作为框架中的对象。长话短说,你不能这样做。也许你可以use cURL to scrape the page你想要的?

+1

谢谢你的回答。我正在尝试使用cURL,但Symfony没有找到它。我必须理清为什么现在... –

+0

这是Symfony2接受的吗? – ElPiter

2

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

3

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'); 
6

我会建议你使用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

+0

这实际上是一个非常好的包,我一直用它来插入REST api,就像一个魅力! –