我正在尝试创建一个三层 Web 应用程序:
- 前端(AngularJS)
- “API 暴露层”与 Symfony2 和 Guzzle (6) 的灵感来自 Meetic 的这些幻灯片:http : //www.slideshare.net/meeticTech/meetic-backend-mutation-with-symfony 用 Symfony2、FOSRestBundle 和 Guzzle 6 构建( 8p/GuzzleBundle)。
- API/网络服务
所以我基本上想要:
- 一个调用我的“API 暴露层”的 AngularJS 前端
- 这个“API 暴露层”调用我的 API/Webservice。
- API/Webservice 将数据持久化到数据库,然后向“API 暴露层”发送 OK/Error
- “API 暴露层”将信息中继到前端,以便在必要时更新/显示错误
我面临的问题是我的“API 暴露层”中的 Guzzle 用自己的通用消息覆盖了来自 API/Web 服务的任何消息,这些消息对我的前端几乎没有用处。
例子 :
{
"code": 500,
"message": "Server error: 500"
}
而不是 API/Webservice 输出的内容
{
"code":500,
"message":"Token already exists"
}
我的问题是:如何从 guzzle 获取原始 API/Webservice 消息而不是通用消息?
这是我的“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);
那只是从不发送异常,并且完全跳过了捕获。