4

我正在尝试创建一个三层 Web 应用程序:

  1. 前端(AngularJS)
  2. “API 暴露层”与 Symfony2 和 Guzzle (6) 的灵感来自 Meetic 的这些幻灯片:http : //www.slideshare.net/meeticTech/meetic-backend-mutation-with-symfony 用 Symfony2、FOSRestBundle 和 Guzzle 6 构建( 8p/GuzzleBundle)。
  3. API/网络服务

所以我基本上想要:

  1. 一个调用我的“API 暴露层”的 AngularJS 前端
  2. 这个“API 暴露层”调用我的 API/Webservice。
  3. API/Webservice 将数据持久化到数据库,然后向“API 暴露层”发送 OK/Error
  4. “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);

那只是从不发送异常,并且完全跳过了捕获。

4

1 回答 1

0

也许这有帮助? 从 Guzzle 中捕获异常

小摘录:

$client = new \Guzzle\Http\Client($httpBase, array(
  'request.options' => array(
     'exceptions' => false,
   )
));
于 2015-11-10T14:50:56.317 回答