【问题标题】:Symfony2 : send a HTTP RequestSymfony2:发送一个 HTTP 请求
【发布时间】:2012-05-16 13:51:25
【问题描述】:

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

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

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



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

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

提前致谢。

【问题讨论】:

    标签: php html http symfony httprequest


    【解决方案1】:

    编辑:我为 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 而不是 file_get_contents),后者是浏览器本身。最后一步是在autoloader(app/autoload.php)中添加一行代码:

    $loader->registerNamespaces(array(
        'Buzz' => __DIR__.'/../vendor/buzz/lib',
    ));
    

    然后您可以在您的控制器代码中获取服务并使用浏览器:

    $browser = $this->get('buzz.browser');
    $response = $browser->get('http://www.google.com');
    

    【讨论】:

    • 我应该编辑什么依赖?是 routing.yml 还是别的什么?我有点迷路了:/无论如何感谢您的回答,这真的很有帮助!
    • @GabrielTheron 首先是deps 文件,然后是src/Company/YourBundle/Resources/config/services.yml(用于服务)和app/autoload.php。
    • 我在尝试加载页面时遇到错误。它说“没有扩展能够加载“buzz.client.curl”的配置”和“寻找命名空间“buzz.client.curl”,没有找到”。知道它来自哪里吗?
    • @GabrielTheron 我现在正在使用它,完全没有问题。您可以尝试:1)检查 curl 是否启用并加载到您的 php.ini 文件中 2)清除 Symfony2 缓存 3)确保 vendos/buzz/lib/Buzz/Client/Curl.php
    • 两个都试过了:/没关系,我会解决这个问题的。谢谢你的回答!
    【解决方案2】:

    两个问题。

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

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

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

    长话短说,你不能那样做。或许你可以use cURL to scrape the page你想要的?

    【讨论】:

    • 感谢您的回答。我正在尝试使用 cURL,但 Symfony 没有找到它。我现在必须弄清楚为什么......
    【解决方案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

    【讨论】:

    • 这实际上是一个非常好的捆绑包,我一直用它来插入一个 REST api,就像一个魅力!
    【解决方案4】:

    为什么不使用 curl?来自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的结果是一个字符串值。
    【解决方案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

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

    更好的是,使用 Goutte 请求外部网站。详情请见https://github.com/FriendsOfPHP/Goutte。

    【讨论】:

      【解决方案6】:

      https://github.com/CircleOfNice/CiRestClientBundle

      方便使用 curl 库的好 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');
      

      【讨论】:

        猜你喜欢
        • 2022-07-26
        • 2022-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多