在所有WebApi的响应中添加额外的json结构?

时间:2014-10-26 20:32:47

标签: asp.net json asp.net-web-api

我们正在与移动软件公司合作,在移动设备上完成我们的应用程序。

我们的控制器有(简化)方法,如:

api/users/1
–GetUserById(...)

api/users/changePassword
–ChangePassword(Person p)

确定。

ChangePassword可以返回几个应用错误代码(密码已经使用,密码太短,密码错误...)

因此,例如,如果已经使用了密码,那么HttpCode应该200返回并附加其他信息

我们就每个回复达成了这个约定:( 附加到响应数据)

{
 "Success":0,
 "ErrorCode": 6,
 "ErrorMessage":"already used"
}

但正如我所说,这种结构应该在每一个回应中。

所以到现在为止 - 例如:api/users/1返回:

{
 "userId":1,
 "name":"John"
}

但是现在 - 响应应该是:

{

 "data":
   {
    "userId":1,
    "name":"John"
   }
,
 "result": //no errors
    {
     "Success":0,
     "ErrorCode": 0,
     "ErrorMessage":""
    }

}

他们总是在寻找“结果”对象以查看应用反应。

问题

我假设我应该在base.SendAsync(响应部分)

之后的消息处理程序中

但是我该怎样包装我通过Request.CreateResponseMessage发送的常规回复,其格式为+值:

enter image description here

注意,当然在Request.CreateResponseMessage阶段我已经有了具有相应结果代码的结果对象。

2 个答案:

答案 0 :(得分:5)

当消息处理程序在Web API管道中运行时,您的操作方法生成的结果将被序列化。动作过滤器是一个更好的选择,因为你可以处理对象,你可以做这样的事情。

public class MyActionFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext context)
    {
        var content = context.Response.Content as ObjectContent;
        if (content != null)
        {
            content.Value =
                new MyResponse()
                {
                    Result = new Result() { Success = 0, ErrorCode = 6 },
                    Data = content.Value
                };
        }
    }
}

public class Result
{
    public int Success { get; set; }
    public int ErrorCode { get; set; }
}

public class MyResponse
{
    public Result Result { get; set; }
    public object Data { get; set; }
}

注意:上面的代码仅适用于JSON而不适用于XML。

答案 1 :(得分:1)

您可以创建ActionFilterAttribute,在OnActionExecuted方法上,您将获得HttpActionExecutedContext,您可以在其中检查响应消息。

您可以通过此属性修饰您的控制器或操作,并返回并创建您自己的ResponseMessage。

希望有所帮助。