asp.Netcore webapi統一処理戻り値、異常、要求パラメータ検証
3147 ワード
現在の開発モデルではaspはあまり使われていない.Netmvcプロジェクトはインタフェースとデータベースを直接操作します.ほとんどは前後端分離を用い,より多くはAPIがモバイル端をサポートするためである.
バックエンドがwebapiを書くときは、必ずフロントエンドと要求値と戻り値のフォーマットを約束する必要があります.異常な戻りがあれば、どのように識別し、区別すればいいですか.
AOP切り込み処理はactionfilterにより実現でき,各メソッドで処理する必要はない.
バックエンドがwebapiを書くときは、必ずフロントエンドと要求値と戻り値のフォーマットを約束する必要があります.異常な戻りがあれば、どのように識別し、区別すればいいですか.
AOP切り込み処理はactionfilterにより実現でき,各メソッドで処理する必要はない.
///
/// Api action
/// {code:200,body:{}}
///
public class ApiResponseFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
//
if (!context.ModelState.IsValid)
{
throw new ApplicationException(context.ModelState.Values.First(p => p.Errors.Count > 0).Errors[0].ErrorMessage);
}
base.OnActionExecuting(context);
}
///
/// , json
/// ExceptionFilterAttribute
///
///
public override void OnActionExecuted(ActionExecutedContext context)
{
if (context.Result != null)
{
var result = context.Result as ObjectResult;
JsonResult newresult;
if (context.Result is ObjectResult)
{
newresult = new JsonResult(new { code = 200, body = result.Value });
}
else if (context.Result is EmptyResult)
{
newresult = new JsonResult(new { code = 200, body = new { } });
}
else
{
throw new Exception($" Result :{ context.Result.GetType().Name}");
}
context.Result = newresult;
}
base.OnActionExecuted(context);
}
}
///
/// api
/// 500 501
///
public class ApiExceptionFilterAttribute : ExceptionFilterAttribute
{
public override void OnException(ExceptionContext context)
{
context.Result = BuildExceptionResult(context.Exception);
base.OnException(context);
}
///
///
///
///
///
private JsonResult BuildExceptionResult(Exception ex)
{
int code = 0;
string message = "";
string innerMessage = "";
//
if (ex is ApplicationException)
{
code = 501;
message = ex.Message;
}
else
{
// exception ,
code = 500;
message = " ";
innerMessage = ex.Message;
}
if (ex.InnerException != null && ex.Message != ex.InnerException.Message)
innerMessage += "," + ex.InnerException.Message;
return new JsonResult(new { code, message, innerMessage });
}
}