P32 局部更新 PATCH




json patch支持的操作,一共有6种
add:就是向资源里面添加值,或者是向数组里面添加一个元素。

开始写代码
JsonPatchDocument需要我们安装一个库



从employee映射到UpdateDto

比如说patchDocument如果有一个只读的操作,它add的一个属性,这个属性在C#类里面并不存在,这时候就会报错,或者是它要修改一个只读的属性。这些都会报错。所以说我们需要处理一下这块。



一个替换的操作replace。然后替换的字段是employeeNo。替换后的值是1111122222

422错误

这是因为asp.net core 3.0开始他是用的json库,是比较新的json库。新的库实现一些比较核心的功能。很多功能还没有实现。

下面我们就是用json.net库要替换。


再次发送请求204

查询结果EmployeeNo确实被更改了。但是出现了一个问题。查询结果变成xml的格式了

headers加上接收的类型。

但是没写Accept的headers为什么默认返回的是xml格式的呢?
因为默认用的是core自带的json库,但是后来我们加了json.net替换了 它,所以默认优先返回的就是xml格式了。
这我们把json.net的添加 到addXml的前面

这样不加accept返回的也是xml格式了。

把名字改成


再查询确实被更新了。

remove操作会把datetime类型设置成默认值

Add+copy



处理验证错误
我们先把employeeNo字段的值移除了。

返回的是500错误。也就是在Controller的model 绑定环节并没有走。

为什么没走因为这个类型是JsonPatchDocument而不是我们的UpdateDto类型。

所以在下面,我们就需要进行手动验证
若果验证失败就返回false,并且错误信息会放在ModelState里面。

ValidationProblem方法就实现了 ValidateProbleDetails的标准



jsonPatchDocument里面也可能出错。比如说我们想删除一个不存在的字段

随便传一个字段

返回500是不对的,因为是客户端引起的错误 ,应该是4开头的。

如果patchDocument里面有任何的验证错误,就会把ModelState的属性变成false,并且错误信息也会放在里面。


也把jsonPatch里面的错误指出了

处理为什么返回的是400,而不是422错误。
ValidationProblem里面返回的错误信息是手动返回的,

之前我们自定义了problemDetails的错误格式。

但是我们这里的ValidationProblem方法并没有采用startup里面配置的ProblemDetails的配置。所以它返回的是400 bad request 而不是422

而这块在model绑定的时候,那个验证才使用了下面的配置。

修改返回的格式
重写下ValidationProblem


我们最后要返回的是采用startup的配置

再次发送请求

局部更新或新增

先new 一个UpdateDto然后还是把patchDocument里面的值 放到dto里面,把modelState传过去做验证。


最后要返回的是employeeDto

测试


把id故意改成9999


返回的header里面

复制headers看看能不能获取这个值

结束

浙公网安备 33010602011771号