28

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 はそれを単独で実行できるはずだと思います。

4

6 に答える 6

33

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 に固有のコードを使用しません。このプロセスを簡素化できるバンドルがあるかもしれませんが、ある場合はわかりません。

于 2012-10-25T15:45:34.577 に答える
27

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");

    ...
}
于 2012-10-25T16:37:52.890 に答える
14

私が知っている最高のクライアント: 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を参照してください。

于 2015-03-22T11:18:44.397 に答える
10

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

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

github ページのドキュメントを読んでもらいましょう。使用方法は非常に基本的なものです。

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

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

echo $response->getContent();
于 2012-10-25T17:57:09.190 に答える