API传参

简介: 在操作方法的参数前面使用Attribute

API传参

在操作方法的参数前面使用Attribute

幂等性

对请求的数据验证

简单验证

usingSystem.ComponentModel.DataAnnotations;

publicclassTouristRouteForCreationDto

{

       [Required(ErrorMessage="title不能为空")]

       [MaxLength(1500)]

       publicstringTitle { get; set; }

       [Required]

       [MaxLength(1500)]

       publicstringDescription { get; set; }

}

属性级别验证

//增加验证Title和Description不能相同

usingSystem.ComponentModel.DataAnnotations;

publicclassTouristRouteForCreationDto:IValidatableObject

{

       [Required(ErrorMessage="title不能为空")]

       [MaxLength(1500)]

       publicstringTitle { get; set; }

       [Required]

       [MaxLength(1500)]

       publicstringDescription { get; set; }

       publicIEnumerable<ValidationResult>Validate(ValidationContextvalidationContext)

       {

           if (Title==Description)

           {

               //yield return 保证ValidationResult后面的代码,下次调用还会继续执行

               //TouristRouteForCreationDto代表错误路径

               yieldreturnnewValidationResult("名称和描述不能相同", new[] { "TouristRouteForCreationDto"});

           }

       }

}

类级别验证

//创建Attribute

publicclassTouristRouteTitleMustBeDifferentFromDescriptionAttribute : ValidationAttribute

{

   protectedoverrideValidationResult?IsValid(object?value, ValidationContextvalidationContext)

   {

       //获得实例

       vartouristRouteDto= (TouristRouteForCreationDto)validationContext.ObjectInstance;

       if (touristRouteDto.Title==touristRouteDto.Description)

       {

           returnnewValidationResult(

                "路线名称必须与路线描述不同",

                new[] { "TouristRouteForCreationDto" }

            );

       }

       returnValidationResult.Success;

   }

}

 

 

[TouristRouteTitleMustBeDifferentFromDescriptionAttribute]//应用属性

publicclassTouristRouteForCreationDto

{

       [Required(ErrorMessage="title不能为空")]

       [MaxLength(1500)]

       publicstringTitle { get; set; }

       [Required]

       [MaxLength(1500)]

       publicstringDescription { get; set; }

}

验证失败返回422状态码

//在program中设置

builder.Services.AddControllers(opt=> {

   opt.ReturnHttpNotAcceptable=true;//可以接收其他格式如xml

}).AddXmlDataContractSerializerFormatters()

.ConfigureApiBehaviorOptions(setupAction=> {

   setupAction.InvalidModelStateResponseFactory=context=>

   {

       varproblemDetail=newValidationProblemDetails(context.ModelState)

       {

           Type="无所谓",

           Title="数据验证失败",

           Status=StatusCodes.Status422UnprocessableEntity,

           Detail="请看详细说明",

           Instance=context.HttpContext.Request.Path//请求路径

       };

       problemDetail.Extensions.Add("traceId", context.HttpContext.TraceIdentifier);//追踪Id

       returnnewUnprocessableEntityObjectResult(problemDetail)

       {

           ContentTypes= { "application/problem+json" }

       };

   };

});

相关文章
|
存储 JavaScript 前端开发
详解js跨页面传参以及API的解释
详解js跨页面传参以及API的解释
241 0
|
运维 API PHP
漏刻有时API接口实战开发系列(13):小鹅通云服务PHP-API二维数组传参解决方案
漏刻有时API接口实战开发系列(13):小鹅通云服务PHP-API二维数组传参解决方案
109 1
|
存储 JavaScript 前端开发
详解js跨页面传参以及API的解释
详解js跨页面传参以及API的解释
125 0
|
存储 JSON 移动开发
详解js跨页面传参以及API的解释
详解js跨页面传参以及API的解释
313 0
|
JSON API 数据格式
|
前端开发 API
VUE04_Promise的概述、常用API、静态方法、axios基于不同请求传参、拦截器、async/await用法(一)
①. Promise的概述和使用 ②. Promise常用API(实例方法) ③. Promise中的静态方法
249 0
VUE04_Promise的概述、常用API、静态方法、axios基于不同请求传参、拦截器、async/await用法(一)
|
JSON JavaScript 前端开发
VUE04_Promise的概述、常用API、静态方法、axios基于不同请求传参、拦截器、async/await用法(二)
④. axios介绍 ⑤. axios基础用法(get和delete) ⑥. axios基础用法(post和put)
201 0