Skip to content

统一返回值格式

  • 在使用 abp 的过程中,如果提供给第三方接口要实现返回值统一需要怎么做?
{
    // 返回格式类似这种
    "success": false,
    "message": "请求失败",
    "data": null,
    "code": 500
}
  • 定义返回类型
public class WrapResult<T>
{
        public bool Success { get; private set; }

        public string Message { get; private set; }

        public T Data { get; private set; }

        public int Code { get; private set; }

        public WrapResult()
        {
            Success = true;
            Message = "Success";
            Data = default;
            Code = 200;
        }

        public void SetSuccess(T data, string message = "Success", int code = 200)
        {
            Success = true;
            Data = data;
            Code = code;
        }

        public void SetFail(string message = "Fail", int code = 500)
        {
            Success = false;
            Message = message;
            Code = code;
        }
}

实现思路

  • 定义 WrapResultAttribute
public class WrapResultAttribute : Attribute
{
}

注册 Filter

    /// <summary>
    /// 异常处理
    /// </summary>
    private void ConfigureAbpExceptions(ServiceConfigurationContext context)
    {
        context.Services.AddMvc
        (
            options =>
            {
                options.Filters.Add(typeof(LionExceptionFilter));
                options.Filters.Add(typeof(LionResultFilter));
            }
        );
    }

    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        ConfigureAbpExceptions(context);
    }

使用

  • 在 Controller 上或者 Action 上打上 WrapResultAttribute 特性
  • 例如
    [Route("Permissions")]
    [WrapResult]
    public class PermissionController : AbpProController,IRolePermissionAppService
    {
        private readonly IRolePermissionAppService _rolePermissionAppService;

        public PermissionController(IRolePermissionAppService rolePermissionAppService)
        {
            _rolePermissionAppService = rolePermissionAppService;
        }

        [HttpPost("tree")]
        [SwaggerOperation(summary: "获取角色权限", Tags = new[] { "Permissions" })]
        [WrapResult] //控制器上打了 action上就不需要
        public Task<PermissionOutput> GetPermissionAsync(GetPermissionInput input)
        {
            return _rolePermissionAppService.GetPermissionAsync(input);
        }

    }
  • 不管接口时有异常还是成功返回结果都是 WrapResult,PermissionOutput 在 WrapResult.Data 中。