我想从我的控制器联系另一个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