13

コントローラーの1つからHTTPリクエストを作成して、別のURLに接続しようとしています。目標は、別のURLに接続し、HTMLの回答をページに出力することです。私は試した :

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

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



私のテンプレートは単に変数「name」を出力しています。
今それをすると、何も返されません。リクエストは送信されないように思われるため、何も返されません。

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

前もって感謝します。

4

6 に答える 6

18

2つの問題。

まず第一にSymfony\Component\HttpFoundation\Request::create()、それはある種の静的初期化子/ファクトリであるの適切な使用法ではありません。コードは次のようになります

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

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

簡単に言えば、そのようにすることはできません。おそらく、cURLを使用して必要なページをスクレイプできますか?

于 2012-05-16T14:06:34.003 に答える
18

編集:私はバズブラウザ用の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を好みます)であり、後者はブラウザー自体です。最後のステップは、オートローダーに1行のコードを追加することです(app/autoload.php):

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

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

$browser = $this->get('buzz.browser');
$response = $browser->get('http://www.google.com');
于 2012-05-16T14:28:43.807 に答える
9

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をご覧ください。

于 2015-03-22T11:28:37.063 に答える
8

カールを使ってみませんか?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);
于 2012-05-16T14:05:57.757 に答える
3

どうやら、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を参照してください。

于 2014-09-22T11:47:30.037 に答える
3

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');
于 2015-03-22T00:06:02.407 に答える