使用FOSRestBundle修改restful响应的对象输出

时间:2014-03-16 19:01:08

标签: symfony fosrestbundle

我无法使用FOSRestBundle实现简单的操作。

如果我返回一个对象,它会按预期工作。 JSON响应看起来像

{ 
  id: ..., 
  property: ... 
}

我想做的是在所有请求和状态代码上返回响应的信封,例如

{
  meta: {
    code: 200,
    message: 'OK',
  }
  data: {
    id: ...,
    property: ...
  }
}

这样,客户端可以编写简单的代码来检测错误,其中响应类似于:

{
  meta: {
    code: 400,
    message: 'Your request failed because...',
  }
  data: {}
}

我想从多个控制器返回它,并仅在JSON或XML请求上返回它。我的第一个想法是使用ResponseListener,检查请求的格式,并在需要时修改响应。或者,也许,只是设置类似的类 \ Model \ APIRequestFormatter,从我的控制器,而不是做return $entity;return APIRequestFormatter->Format($entity);

这两种方法对我来说都是有缺陷的,有没有人有任何提示?

1 个答案:

答案 0 :(得分:4)

你应该看一下这个非常完整的博文: http://williamdurand.fr/2012/08/02/rest-apis-with-symfony2-the-right-way/

William Durand谈到如何使用正确的状态代码创建一个好的REST Api和JSON响应。

如果您关注William在其文章中所写的内容,您将根据以下格式获得JSON响应:

{
    code: 400,
    message: "Your message",
    first_data: "...",
    second_data: "...",
    ...
}

这不正是您所寻找的。但我认为客户必须编写的代码将与您提出的格式一样简单:

{
  meta: {
    code: 400,
    message: 'Your request failed because...',
  }
  data: {}
}

也许你可以展示你在控制器中所做的事情,这样我的回答就会更准确。


更新

使用以下控制器,您应该能够返回所需的JSON响应:

use Symfony\Component\HttpFoundation\JsonResponse;

class MyController{
    //...
    public function myAction(){
        $myStatusCode = 400;

        return new JSonResponse(
            array('meta' => array('code' => $myStatusCode,
                                  'message' => 'Your request failed because...'),
                  'data' => array('your datas')
            ),
            $myStatusCode
        );
    }
    //...
}

这将在标题中创建一个包含正确状态代码的响应,并允许您在JSon响应中添加所需的消息和状态代码。