我无法使用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);
这两种方法对我来说都是有缺陷的,有没有人有任何提示?
答案 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响应中添加所需的消息和状态代码。