web-dev-qa-db-ja.com

symfony2:HTTPリクエストを送信する

コントローラーの1つから別のURLにアクセスするためのHTTPリクエストを作成しようとしています。別のURLにアクセスし、ページにHTMLの回答を印刷するだけです。私は試した :

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

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



私のテンプレートは単に変数「name」を出力しています。
これを実行しても、何も返されません。リクエストが送信されなかったようです。そのため、何も返されません。

私の質問は、どのようにリクエストを送信し、レスポンスのコンテンツを取得するのですか?

前もって感謝します。

13
Gabriel Theron

[〜#〜] edit [〜#〜]:バズブラウザ用に GremoBuzzBundle を作成しました。 SensioBuzzBundle に似ていますが、いくつかの素晴らしい構成オプションがあります。

バズブラウザー と依存関係の注入を使用することをお勧めします。バズはcURLまたはfile_get_contentsのラッパーです。次の行を追加してdepsファイルを編集します。

[Buzz]
    git=https://github.com/kriswallsmith/Buzz.git
    target=/buzz

次に、ベンダーをインストールして実際にライブラリをダウンロードします。

php bin/vendors install

次に、2つのサービス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よりもcURLを好みます)、後者はブラウザ自体です。最後のステップは、autoloaderapp/autoload.php):

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

次に、サービスを取得し、controllerコードでブラウザを使用できます。

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

2つの問題。

まず第一に、それはSymfony\Component\HttpFoundation\Request::create()の適切な使用法ではありません。これは静的なイニシャライザ/ファクトリの一種です。コードは次のようになります

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

これで、適切なRequestオブジェクトが作成されました。ただし、これは無関係であり、これが2番目の問題です。それは、Symfonyのリクエストオブジェクトが機能するように設計されている方法ではありません。その目的はHTTPリクエストの実行ではなく、の表現としてフレームワーク内のオブジェクト。

簡単に言えば、そのように行うことはできません。たぶん cURLを使用してページをこする したいですか?

17
Peter Bailey

GuzzleHttpクライアントを使用することをお勧めします-私が知っている最高のクライアント: http://docs.guzzlephp.org/en/latest/

Symfony2プロジェクトに統合するNiceバンドルはすでにあります: 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

9
Kamil Adryjanek

Curlを使用しないのはなぜですか?から 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);
8
koral

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');
3
Tobias

どうやら、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内のヘッドレスブラウザ。

さらに良いことに、外部WebサイトへのリクエストにはGoutteを使用します。詳細は https://github.com/FriendsOfPHP/Goutte を参照してください。

3
Mauro Colella