【问题标题】:Modifying object output of a restful response using FOSRestBundle使用 FOSRestBundle 修改静止响应的对象输出
【发布时间】:2014-03-16 19:01:08
【问题描述】:

我在使用 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);

这两种方法对我来说似乎都有缺陷,有人有什么建议吗?

【问题讨论】:

    标签: symfony fosrestbundle


    【解决方案1】:

    您应该看看这篇非常完整的博文: 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 响应中添加所需的消息和状态代码。

    【讨论】:

    • 非常感谢您的回复。我确实非常密切地遵循了该教程。问题是您在此处显示的响应确实是错误响应的样子,而不是成功的实体响应的样子。我希望能够为所有响应、错误和成功添加一个一致的信封,但在我看来,没有一个好的方法可以做到这一点。
    • @Pez 您是否尝试过使用 curl 向您的控制器发送请求?当您发送请求时,您会在响应的标头中收到状态代码。例如,我发送这个简单的请求curl -v -H "Accept: application/json" -H "Content-type: application/json" localhost/my_api.json 。如果成功,我将收到的响应标题为:HTTP/1.1 200 OK。因此,根据这些数据,我将能够知道它是否成功。我知道这并不完全是您想要实现的目标,因此如果对您不利,请告诉我。我很乐意寻找其他解决方案
    • 我想我发现了另一个可以帮助您的问题:stackoverflow.com/questions/12385923/… 我知道这是关于错误消息,但 Florian Eckerstorfer 提供的答案允许您添加任何您想要的内容。我更新了我的答案。
    猜你喜欢
    • 2019-07-17
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 2013-04-29
    • 2014-05-30
    相关资源
    最近更新 更多