我试图从我的控制器之一发出一个HTTP请求来联系另一个URL,目标是联系另一个URL,并简单地在我的页面中打印HTML答案。 我想:Symfony2:发送HTTP请求
我的模板简单的打印变量 “名”。
现在,当我这样做,没有任何返回。在我看来,请求永远不会被发送,这就是为什么没有返回。
我的问题是:我如何发送请求并获取响应的内容?
在此先感谢。
我试图从我的控制器之一发出一个HTTP请求来联系另一个URL,目标是联系另一个URL,并简单地在我的页面中打印HTML答案。 我想:Symfony2:发送HTTP请求
我的模板简单的打印变量 “名”。
现在,当我这样做,没有任何返回。在我看来,请求永远不会被发送,这就是为什么没有返回。
我的问题是:我如何发送请求并获取响应的内容?
在此先感谢。
编辑:我为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');
为什么不使用卷曲?从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);
我会考虑它,但不会要求我写到一个文件? –
不,curl的结果是一个字符串值。 – Acyra
两个问题。
首先,这不是Symfony\Component\HttpFoundation\Request::create()
的正确用法,这是一个静态初始化/工厂的排序。你的代码应该看起来像这样
$r = Request::create('http://www.google.com', 'GET');
现在你有一个合适的Request对象。然而,这是无关紧要的,这是你的第二个问题:这不是Symfony的请求对象设计工作的方式。它的目的不是为执行 HTTP请求,它的代表它们作为框架中的对象。长话短说,你不能这样做。也许你可以use cURL to scrape the page你想要的?
谢谢你的回答。我正在尝试使用cURL,但Symfony没有找到它。我必须理清为什么现在... –
这是Symfony2接受的吗? – ElPiter
显然,您可以使用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。
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');
我会建议你使用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();
这实际上是一个非常好的包,我一直用它来插入REST api,就像一个魅力! –
我应该编辑哪些依赖项?它是routing.yml还是别的?我有点迷失在这里:/ 无论如何感谢您的答案,这真的很有帮助! –
@GabrielTheron首先'deps'文件,然后是'src/Company/YourBundle/Resources/config/services.yml'(用于服务)和'app/autoload.php'。 – gremo
当我尝试加载页面时出现错误。它说:“没有扩展能够加载配置”buzz.client.curl“”和“查找名称空间”buzz.client.curl“,找不到”。任何想法来自哪里? –