使用自定义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
}