2021-01-18HttpPut、HttpPatch、HttpDelete和自定义的错误

自定义错误

针对ModelState进行自定义错误

            services.AddControllersWithViews()
            .ConfigureApiBehaviorOptions(setup =>
            {
                setup.InvalidModelStateResponseFactory = context =>
                {
                    var problemDetails = new ValidationProblemDetails(context.ModelState)
                    {
                        Type = "Https://www.baidu.com",
                        Title = "有错误!!!",
                        Status = StatusCodes.Status422UnprocessableEntity,
                        Detail = "详见错误信息",
                        Instance = context.HttpContext.Request.Path,
                    };

                    problemDetails.Extensions.Add("traceId", context.HttpContext.TraceIdentifier);

                    return new UnprocessableEntityObjectResult(problemDetails)
                    {
                        ContentTypes = { "application/problem+json" }
                    };
                };
            });

针对ValidationProblem(ModelState)进行自定义错误

在Controller里进行一个override

        public override ActionResult ValidationProblem(
            [ActionResultObjectValue] ModelStateDictionary modelStateDictionary)
        {
            var options = HttpContext.RequestServices.GetRequiredService<IOptions<ApiBehaviorOptions>>();

            return (ActionResult)options.Value.InvalidModelStateResponseFactory(ControllerContext);
        }

HttpPut、HttpPatch、HttpDelete

HttpPut,用于整体更新、替换

        [HttpPut("{CollegeId}")]
        public async Task<IActionResult> UpdateCollege(long collegeId,CollegeUpdateDto updateDto)
        {
            CollegeModel college = await _CollegeService.FindCollegeByIdAsync(collegeId);
            if (college == null) return NotFound();

            if(! await _CollegeService.UpdateCollegeAsync(_Mapper.Map(updateDto, college)))
            {
                return BadRequest();
            }
            return NoContent();
        }
  • HttpPut所使用的UpdateDto需要新类,不能使用AddDto,因为二者作用不同。
  • put会更新所有属性,UpdateDto必须全部不能为空,不然可为空的值如果没有put会被更新为默认值。

HttpPatch

引入Microsoft.AspNetCore.Mvc.NewtonsoftJson包,并添加,且需要放在xml格式上面,会顶掉默认的json格式。

.AddNewtonsoftJson(setup =>
            {
                setup.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
            })
  • JsonPatchDocument引用包:Microsoft.AspNetCore.JsonPatch
  • IOptions 引用Microsoft.Extensions.Options包
        [HttpPatch("{CollegeId}")]
        public async Task<IActionResult> PartiallyUpdateCollege(
            long collegeId, JsonPatchDocument<CollegeUpdateDto> patchDocument)
        {
            CollegeModel college = await _CollegeService.FindCollegeByIdAsync(collegeId);
            if (college == null) return NotFound();
            var patchDto = _Mapper.Map<CollegeUpdateDto>(college);
            //patch命令,并验证patch命令是否正确,第二个属性为将错误添加到modelstate。
            patchDocument.ApplyTo(patchDto,ModelState);
            //主动验证modelstate错误
            if (!TryValidateModel(patchDto))
            {
                return ValidationProblem(ModelState);
            }

            _Mapper.Map(patchDto, college);
            if(! await _CollegeService.UpdateCollegeAsync(college))
            {
                return BadRequest();
            }
            return NoContent();
        }

Patch Json格式:

  • operation类型:add、remove、replace、move、copy、test
  • remove:{ "op": "remove", "path": "/customerName" }
  • add、replace、test:{"op": "test", "path": "/customerName", "value": "Nancy" },
  • move、copy:{ "op": "move", "from": "/orders/0/orderName", "path": "/customerName" }

Patch 验证

  1. 验证patch指令是否正确
  2. 验证传入的model是否存在问题。

HttpDelete

[HttpDelete("{CollegeId}")]

        public async Task<IActionResult> DeleteCollege(long CollegeId)
        {
            CollegeModel college = await _CollegeService.FindCollegeByIdAsync(CollegeId);
            if (college == null) return NotFound();
            if (!await _CollegeService.DelCollegeByModelAsync(college)) return BadRequest();
            return NoContent();
        }

课程来源:Restful Api

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值