自定义错误
针对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 验证
- 验证patch指令是否正确
- 验证传入的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