4

3 層 Web アプリケーションを作成しようとしています。

  1. フロントエンド (AngularJS)
  2. Symfony2 と Guzzle (6) を使用した「API 公開レイヤー」は、Meetic によるこれらのスライドに触発されたものです: http://www.slideshare.net/meeticTech/meetic-backend-mutation-with-symfony Symfony2、FOSRestBundle、および Guzzle 6 で構築された ( 8p/ガズルバンドル)。
  3. API/ウェブサービス

だから私は基本的に欲しい:

  1. 私の「API公開レイヤー」を呼び出すAngularJSフロントエンド
  2. この「API 公開レイヤー」は、私の API/Web サービスを呼び出します。
  3. API/Web サービスはデータをデータベースに保持し、OK/エラーを「API 公開レイヤー」に送信します。
  4. 「API公開レイヤー」は情報をフロントエンドに中継し、必要に応じてエラーを更新/表示できるようにします

私が直面している問題は、「API 公開レイヤー」の Guzzle が、API/Web サービスからのメッセージを、フロントエンドにとって実質的に役に立たない独自の汎用メッセージで上書きすることです。

例 :

{
  "code": 500,
  "message": "Server error: 500"
}

API/Web サービスによって出力されるものの代わりに

{
  "code":500,
  "message":"Token already exists"
}

私の質問は、一般的なものではなく、guzzle から元の API/Web サービス メッセージを取得するにはどうすればよいですか?

これが私の「API / Webservice」コントローラーメソッドです:

public function postAppTokensAction($guid)
{
    $request = $this->get('request');

    if (!$request->request->get('key')) {
        throw new HttpException(500, 'Missing Key');
    }

    if (!$request->request->get('secret')) {
        throw new HttpException(500, 'Missing Secret');
    }

    $repository = $this->getDoctrine()
        ->getRepository('AppBundle:App');

    $app = $repository->findOneByGuid($guid);

    $token = new Token();

    $token->setKey($request->request->get('key'));
    $token->setSecret($request->request->get('secret'));
    $token->setApp($app);

    try {
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($token);
        $entityManager->flush();

        return $app;

    } catch(\Exception $e) {
        throw new HttpException(500, "Token allready exists");
    }  
}

これが私の「API公開レイヤー」コントローラーメソッドです:

public function postAppTokensAction($guid)
{
    $client   = $this->get('guzzle.client.ws_app');

    try { 
        $response = $client->request('POST', '/apps/' . $guid . '/tokens', [
            'json' => [
                'key' => '123',
                'secret' => '123'
            ]   
        ]);
    } catch (Exception $e) {
        //No luck in getting the original API message here
    }

    return json_decode($response->getBody(), true);
}

編集 :

古いバージョンの Guzzle 用であり、構文が変更されているため、Guzzle からの例外のキャッチは重複しているとは思いません。

http_errors => false を追加してみました:

try { 
        $response = $client->request('POST', '/apps/' . $guid . '/tokens', [
            'http_errors' => false,
            'json' => [
                'key' => '12345555',
                'secret' => '123'
            ]   
        ]);
    } catch (\Exception $e) {
            die($e);
    }

    return json_decode($response->getBody(), true);

それは決して例外を送信せず、キャッチは完全にスキップされます。

4

1 に答える 1