# RESTful API

#### PATCH部分更新

部分更新使用PATCH方法完成，它能够由客户端选择要更新资源的属性，因此PATCH的请求正文与PUT不一样。PATCH方法的请求正文使用的是JSON Patch文档格式。JSONPatch是描述JSON文档内容变化的一种特殊的JSON格式文档。它与HTTP PATCH方法结合使用，能够实现对资源的部分更新。关于JSON Patch格式的更多信息，可参考<http://jsonpatch.com/>

![](https://937995404-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMTM8NYe0uekudlCMKb%2F-MN7RaiJdMzq2n-WTegE%2F-MN7VYGbOPjISwrW_4Cj%2Fimage.png?alt=media\&token=85f20e38-cd13-4566-ad40-aabcffd7205e)

文档由一个数组构成，数组中的每个元素代表一个更改项，每一项包括3项。

* op：操作类型
* path：对象的属性名
* value：对象的值

op的值有6种

* add：向对象添加一个属性，或向数组添加一个元素
* remove：从对象中移除移除一个属性，或从数据中移除一个元素
* replace：为一个属性替换新值
* copy：将一个属性的值复制到另一个属性上
* move：将一个属性的值”移动“到另一个属性上，原属性的值将被清空
* test：测试属性的值是否与指定的值相等

#### ACCEPT内容协商

客户端指明格式是在其请求消息的消息头中添加Accept项，它的值是一个MIME类型，如application/xml。它的意思是告诉服务端，客户端需要的数据格式是XML格式。服务端在收到这个请求后，如果支持返回此格式的数据，则直接返回指定格式的数据;反之，如果不支持，那么应返回406 Not Acceptable状态码，该状态码的意思是告诉客户端，服务端无法提供此种格式的响应。以上过程称为内容协商。

![](https://937995404-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MMTM8NYe0uekudlCMKb%2F-MN7YGQBnUuZeJm34dE3%2F-MN7YiAbOUwPQKV-m_yC%2Fimage.png?alt=media\&token=26067acc-f3d6-4354-b51c-466c39e900b7)

在ASP.NET Core中默认将`ReturnHttpNotAcceptable`设为False，所以无论将Accept改为什么类型，依然只会返回Json。在配置MVC时将此项设为True即可返回406 Not Acceptable.

实现内容协商：

在配置MVC时添加将需要的Formatter即可

```
services.AddMvc(config =>
{
    //对于不支持Accept类型返回406
    config.ReturnHttpNotAcceptable = true;
    //config.OutputFormatters.Add(new XmlSerializerOutputFormatter());
}).AddXmlSerializerFormatters();
```

MvcOptions类包括若干属性，其中OutputFormatters和InputFormatters分别是输出Formatter和输入Formatter的集合。在上述代码中，在输出Formatter集合中添加了XmlSerializerOutputFormatter，这样服务器就能够正确地输出XML格式的数据了。

除了常见的XML与JSON格式，如果请求头中的Accept是特殊格式，如CSv (text/csv)或vCard (text/vcard)格式等，若要使服务器能返回相应格式的数据，就需要创建自定义格式的Formatter。自定义Formater应继承自TextOutputFormatter 类或 TextlnputFormatter类，前者用于创建自定义输出Formatter，后者则用于创建自定义输入Formatter。

自定义Formatter参考微软官方文档：[ASP.NET Core Web API 中的自定义格式化程序](https://docs.microsoft.com/zh-cn/aspnet/core/web-api/advanced/custom-formatters?view=aspnetcore-5.0)
