【问题标题】:Add additional json structure to all WebApi's responses?为所有 WebApi 的响应添加额外的 json 结构?
【发布时间】:2014-10-26 20:32:46
【问题描述】:

我们正在与移动软件公司整合,以便在移动设备上开发我们的应用程序。

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

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 发送的常规响应,格式为:

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

【问题讨论】:

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


    【解决方案1】:

    当消息处理程序在 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。

    【讨论】:

    • 哇巴德里,我几乎感到不舒服,但你总是用代码和解释来回答——作为对问题的准确答案。 .非常感谢!
    • XML 序列化程序无法处理object
    • 我的过滤器没有被调用。我错过了什么吗?
    【解决方案2】:

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

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

    希望对您有所帮助。

    【讨论】:

    • 感谢您的回复。OnActionExecuted 确实是解决方案。
    • Omar 嗨,现在可以去聊天了吗?
    猜你喜欢
    • 2015-10-09
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    相关资源
    最近更新 更多