3 層 Web アプリケーションを作成しようとしています。
- フロントエンド (AngularJS)
- Symfony2 と Guzzle (6) を使用した「API 公開レイヤー」は、Meetic によるこれらのスライドに触発されたものです: http://www.slideshare.net/meeticTech/meetic-backend-mutation-with-symfony Symfony2、FOSRestBundle、および Guzzle 6 で構築された ( 8p/ガズルバンドル)。
- API/ウェブサービス
だから私は基本的に欲しい:
- 私の「API公開レイヤー」を呼び出すAngularJSフロントエンド
- この「API 公開レイヤー」は、私の API/Web サービスを呼び出します。
- API/Web サービスはデータをデータベースに保持し、OK/エラーを「API 公開レイヤー」に送信します。
- 「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);
それは決して例外を送信せず、キャッチは完全にスキップされます。