Spring 我应该如何设计RESTAPI?

Spring 我应该如何设计RESTAPI?,spring,rest,http,Spring,Rest,Http,我正在用spring框架制作一个RESTAPI。然后,我很担心,所以我开始发帖 当有如下数据时 获取/users/1 { "name": "mike", "age": 21 } { "name": "mike" } { "name": "mike2", "age": null } { "

我正在用spring框架制作一个RESTAPI。然后,我很担心,所以我开始发帖

当有如下数据时

获取/users/1

{
   "name": "mike",
   "age": 21
}
{
   "name": "mike"
}
{
   "name": "mike2",
   "age": null
}
{
   "name": "mike2",
   "age": 21
}
目前,RESTAPI的开发如下

PUT/users/1

{
   "name": "mike",
   "age": 21
}
{
   "name": "mike"
}
{
   "name": "mike2",
   "age": null
}
{
   "name": "mike2",
   "age": 21
}
当PUT如上所述请求时,名称将更改,缺少的属性age将变为null,如下所示

获取/users/1

{
   "name": "mike",
   "age": 21
}
{
   "name": "mike"
}
{
   "name": "mike2",
   "age": null
}
{
   "name": "mike2",
   "age": 21
}

修补程序/用户/1

{
   "name": "mike2"
}
当按上述方式请求修补程序时,名称会更改,缺少的属性年龄不会更改,如下所示

获取/users/1

{
   "name": "mike",
   "age": 21
}
{
   "name": "mike"
}
{
   "name": "mike2",
   "age": null
}
{
   "name": "mike2",
   "age": 21
}
我想知道这是否符合RESTAPI规则

如果这不合适,如果我想在一个请求中修改姓名和删除年龄,我该如何请求


我需要帮助。

强烈建议阅读RFC

RFC 7231超文本传输协议(HTTP/1.1):语义和内容

特别要注意第4.3节的方法定义

“POST方法请求目标资源根据资源自身的特定语义处理请求中包含的表示。”

“PUT方法请求创建目标资源的状态,或将其替换为请求消息负载中包含的表示所定义的状态。”

也就是说,您将发现更新操作的处理方式有所不同(一些人使用POST,一些人使用PATCH,许多人使用PUT),这取决于他们特定于实现的资源语义

在您的示例中,PUT资源特定的语义实现似乎将提交的数据元素视为完全替换,并且由于您没有包含age元素,因此将其保留为null

补丁确实是用于执行部分更新的动词,请参见:

用于HTTP的RFC 5789修补程序方法

修补程序方法请求将请求实体中描述的一组更改应用于由请求URI标识的资源。该组更改以称为“修补程序文档”的格式表示,由媒体类型标识

“PUT和PATCH请求之间的差异反映在服务器处理封闭实体以修改请求URI标识的资源的方式上。在PUT请求中,封闭的实体被视为存储在源服务器上的资源的修改版本,客户端请求替换存储的版本。然而,对于补丁,封闭的实体包含一组说明,说明如何修改当前驻留在源服务器上的资源以生成新版本。补丁方法会影响由请求URI标识的资源,并且可能会对其他资源产生副作用;i、 例如,可以通过应用修补程序创建新资源或修改现有资源。”

“面片既不安全也不幂等”

“不能保证可以使用修补程序修改资源。此外,预计不同的补丁文档格式将适用于不同类型的资源,并且没有单一格式适用于所有类型的资源。因此,实施不需要支持单一的默认修补程序文档格式。”

“客户需要选择何时使用修补程序而不是放置。例如,如果修补程序文档大小大于将在PUT中使用的新资源数据的大小,则使用PUT而不是修补程序可能是有意义的。与POST进行比较更加困难,因为POST的使用方式千差万别,如果服务器选择,它可以包含PUT和补丁式操作。如果操作没有以可预测的方式修改请求URI标识的资源,则应考虑POST,而不是PATCH或PUT。”

有关JSON文档,请参阅

RFC 6909-JavaScript对象表示法(JSON)修补程序

“JSON补丁定义了一个JSON文档结构,用于表示应用于JavaScript对象表示法(JSON)文档的操作序列;它适合与HTTP补丁方法一起使用。“application/json patch+json”媒体类型用于标识此类补丁文档。”

此外,您可能会发现这些资源很有用