我们正在与移动软件公司合作,在移动设备上完成我们的应用程序。
我们的控制器有(简化)方法,如:
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
阶段我已经有了具有相应结果代码的结果对象。
答案 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。
希望有所帮助。