web-dev-qa-db-ja.com

Symfony2-外部リクエストを実行する方法

Symfony2を使用して、HTTPSに基づく外部APIにアクセスする必要があります。

外部URIを呼び出して、それを使用して「再生」する応答を管理するにはどうすればよいですか。たとえば、成功または失敗のメッセージを表示するには?

私は次のようなことを考えています(performRequestは完全に発明されたメソッドであることに注意してください):

$response = $this -> performRequest("www.someapi.com?param1=A&param2=B");

if ($response -> getError() == 0){
    // Do something good
}else{
    // Do something too bad
}

バズやその他のクライアントについて読んでいます。しかし、Symfony2は独自にそれを行うことができるはずだと思います。

26
ElPiter

CURLを使用することをお勧めします。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'www.someapi.com?param1=A&param2=B');
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/json')); // Assuming you're requesting JSON
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

$response = curl_exec($ch);

// If using JSON...
$data = json_decode($response);

注:Webサーバーのphpにはphp5-curlライブラリがインストールされました。

APIリクエストがJSONデータを返していると仮定すると、 このページ が役立つ場合があります。

これは、Symfony2に固有のコードを使用しません。このプロセスを簡素化できるバンドルがあるかもしれませんが、もしあれば、それについては知りません。

33
RobMasters

Symfonyにはこのための組み込みサービスがありませんが、これは依存性注入フレームワークを使用して独自のサービスを作成する絶好の機会です。ここでできることは、外部呼び出しを管理するサービスを書くことです。サービスを「http」と呼びましょう。

最初に、performRequest()メソッドを使用してクラスを記述します。

_namespace MyBundle\Service;

class Http
{    
    public function performRequest($siteUrl)
    {
        // Code to make the external request goes here
        // ...probably using cUrl
    }
}
_

_app/config/config.yml_でサービスとして登録します:

_services:
    http:
        class: MyBundle\Service\Http
_

これで、コントローラーは「http」というサービスにアクセスできます。 symfonyは「コンテナ」でこのクラスの単一のインスタンスを管理し、$this->get("http")経由でアクセスできます:

_class MyController
{
    $response = $this->get("http")->performRequest("www.something.com");

    ...
}
_
27
Thomas Kelley

私が知っている最高のクライアント: http://docs.guzzlephp.org/en/latest/

Symfony2プロジェクトに統合するバンドルが既にあります: https://github.com/8p/GuzzleBundle

$client   = $this->get('guzzle.client');

// send an asynchronous request.
$request = $client->createRequest('GET', 'http://httpbin.org', ['future' => true]);
// callback
$client->send($request)->then(function ($response) {
    echo 'I completed! ' . $response;
});

// optional parameters
$response = $client->get('http://httpbin.org/get', [
    'headers' => ['X-Foo-Header' => 'value'],
    'query'   => ['foo' => 'bar']
]);
$code = $response->getStatusCode();
$body = $response->getBody();

// json response
$response = $client->get('http://httpbin.org/get');
$json = $response->json();

// extra methods
$response = $client->delete('http://httpbin.org/delete');
$response = $client->head('http://httpbin.org/get');
$response = $client->options('http://httpbin.org/get');
$response = $client->patch('http://httpbin.org/patch');
$response = $client->post('http://httpbin.org/post');
$response = $client->put('http://httpbin.org/put');

詳細については、次を参照してください。 http://docs.guzzlephp.org/en/latest/index.html

12
Kamil Adryjanek

https://github.com/sensio/SensioBuzzBundle はあなたが探しているもののようです。

Kris Wallsmithバズライブラリを実装して、HTTP要求を実行します。

Githubページでドキュメントを読むことができます。使用方法はかなり基本的なものです。

$buzz = $this->container->get('buzz');

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

echo $response->getContent();
10
SebScoFr

Symfonyには独自のrestクライアントがありませんが、すでに述べたように、いくつかのバンドルがあります。これは私の好みのものです:

https://github.com/CircleOfNice/CiRestClientBundle

$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');

リクエストを送信する

$response = $restclient->get($url); 

symfony応答オブジェクトを取得します。その後、次の方法でステータスコードを取得できます。

$httpCode = $response-> getStatusCode();

コードは次のようになります。

$restClient = $this->container->get('ci.restclient');
if ($restClient->get('http://www.yourUrl.com')->getStatusCode !== 200) {
    // no error
} else {
    // error
}
3
Tobias