使用自定义ApiResult<> 对象返回数据

创建ApiResult:

public class ApiResult
{
    public string Message { get; set; }
    public ApiResultCode Code { get; set; }
    public ApiResult() { }
    public ApiResult(ApiResultCode Code, string Message)
    {
        this.Code = Code;
        this.Message = Message;
    }
    public static ApiResult Success(string Message) => new ApiResult(ApiResultCode.Success, Message);

    public static ApiResult Error(string Message) => new ApiResult(ApiResultCode.Error, Message);
    /*public static ResponseModel Error(string Message, object Data) => new ResponseModel(ResponseCode.Error, Message, Data);*/
}
public class ApiResult<T> : ApiResult
{
    public T Data { get; set; }
    public ApiResult(ApiResultCode Code, string Message, T Data)
    {
        this.Code = Code;
        this.Message = Message;
        this.Data = Data;
    }
    public static ApiResult<T> Success(string Message, T Data) => new ApiResult<T>(ApiResultCode.Success, Message, Data);
}
public enum ApiResultCode
{
    Success = 0,
    Error = 1,
    ValidateFailed = 2
}

furion中需要使用services.AddControllersWithViews().AddInjectWithUnifyResult<ApiResultProvider>()来实现接口返回

所以需要创建一个ApiResultProvider:

/// <summary>
/// 自定义接口返回
/// </summary>
[SuppressSniffer, UnifyModel(typeof(ApiResult<>))]
public class ApiResultProvider : IUnifyResultProvider
{
    public IActionResult OnAuthorizeException(DefaultHttpContext context, ExceptionMetadata metadata)
    {
        return new JsonResult(new ApiResult(ApiResultCode.Error,"未认证"));
    }

    public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata)
    {
        return new JsonResult(new ApiResult<object>(ApiResultCode.Error, "", metadata.Errors));
    }

    public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings = null)
    {
        // 设置响应状态码
        UnifyContext.SetResponseStatusCodes(context, statusCode, unifyResultSettings);

        switch (statusCode)
        {
            // 处理 401 状态码
            case StatusCodes.Status401Unauthorized:
                await context.Response.WriteAsJsonAsync(new ApiResult(ApiResultCode.Error, "401 未认证")
                    , App.GetOptions<JsonOptions>()?.JsonSerializerOptions);
                break;
            // 处理 403 状态码
            case StatusCodes.Status403Forbidden:
                await context.Response.WriteAsJsonAsync(new ApiResult(ApiResultCode.Error, "403 Forbidden")
                    , App.GetOptions<JsonOptions>()?.JsonSerializerOptions);
                break;
            default: break;
        }
    }

    public IActionResult OnSucceeded(ActionExecutedContext context, object data)
    {
        return new JsonResult(new ApiResult<object>(ApiResultCode.Success, "", data));
    }

    public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata)
    {
        return new JsonResult(new ApiResult<object>(ApiResultCode.ValidateFailed, "参数验证失败",metadata.ValidationResult));
    }
}

最后在AddControllers后面设置AddInjectWithUnifyResult<ApiResultProvider>();

效果:

当数据验证不通过时:

{
  "data": {
    "Password": [
      "密码长度不能小于5"
    ],
    "UserName": [
      "用户名长度不能小于5"
    ]
  },
  "message": "参数验证失败",
  "code": 2
}

请求成功或失败后返回的正常数据:

{
  "data": {
    "accessToken": "",
    "refreshToken": "",
    "accessToken_expiredTime": 0,
    "refreshToken_expiredTime": 0
  },
  "message": "",
  "code": 0
}