如何在RESTAPI中处理更新?
我想了解一些使用RESTful API执行写操作的方法。对于本例,假设一个Person对象:如何在RESTAPI中处理更新?,rest,api,Rest,Api,我想了解一些使用RESTful API执行写操作的方法。对于本例,假设一个Person对象: { "id": 1, "name": "Example Person", "addresses": [ { "id": 11, } ], "friends": [ { "id": 21, "name": "John" }
{
"id": 1,
"name": "Example Person",
"addresses": [
{
"id": 11,
}
],
"friends": [
{
"id": 21,
"name": "John"
}
] }
有一个/people API提供类似的对象。您可以获取/people/123来检索上述示例。不过,我关心的是写作。传统上,通过restapi更新这样的对象是通过向/people/123发送补丁或将对象的新状态放到/people/123来完成的。但是,您可能正在更新中执行一项或多项操作:
- 改名
- 更新现有地址
- 添加新地址
- 删除地址
- 更新现有朋友
- 将现有人员添加为新朋友
- 不要和别人做朋友
当与REST API通信时,发送要执行的操作列表是否有价值,而不仅仅是发送对象的新状态并要求API根据该状态确定用户打算执行的操作?此类功能通常由API网关执行(外观设计模式)客户端将向网关API调用发送请求,网关将调用每个微服务API。这种功能通常由API网关(门面设计模式)执行。客户端将向网关API调用发送请求,网关将调用每个微服务API。您的意思是业务规则,必须放在业务逻辑层,客户端不能关心/知道必须根据某些请求执行的操作。我认为您应该做的是在BusinessLogic层中创建一些检查机制来更改属性,然后根据此检查采取一些操作(如果您需要执行不同的操作,无论您是否解除朋友关系/更改名称/等等) 您的意思是业务规则,必须放在业务逻辑层中,客户端不能关心/知道必须根据某些请求执行的操作。我认为您应该做的是在BusinessLogic层中创建一些检查机制来更改属性,然后根据此检查采取一些操作(如果您需要执行不同的操作,无论您是否解除朋友关系/更改名称/等等) 前端不应该关心如何处理更新的数据。它只是注意到一些变化。这就是解耦层架构的思想。因此,如果更新触发发送电子邮件,例如,这需要由后端本身完成
您可能会争辩说RESTAPI不应该包括进一步的业务逻辑,通常这是正确的。因此,要分离关注点,您的API可以提供CRUD内容,并通知所有注册的侦听器更改,然后发送电子邮件。前端不应该关心如何处理更新的数据。它只是注意到一些变化。这就是解耦层架构的思想。因此,如果更新触发发送电子邮件,例如,这需要由后端本身完成
您可能会争辩说RESTAPI不应该包括进一步的业务逻辑,通常这是正确的。因此,要分离关注点,您的API可以提供CRUD内容,并通知所有注册的侦听器关于更改的信息,然后发送电子邮件。您的对象包含其他对象的列表。从技术上讲,您处理许多对象,而不是单个对象。因此,JSON结果不是RESTful的。REST基于资源(您称之为对象),当它们不是复合物时,您通常会将它们隔离。所以当你打电话的时候
GET/people/123
,这应该而不是提供您所介绍的示例。它应该提供如下内容:
{ "id" : 123,
"name" : "Example Person" }
PUT /people/{id}/friends
这是一个合适的人力资源,仅此而已。朋友和地址将被设计为子资源,并应通过其自己的API进行访问,例如:
GET /people/{id}/addresses
GET /people/{id}/friends
当有人加你为好友时,你自然会有明确的资源需求。下面是一个例子:
POST /people/{id}/friends
这篇POST
的正文中包含了一位朋友的身份证,很可能仅此而已
旁注:当您稍后返回朋友列表时,您只会看到朋友ID列表,而不会看到他们的详细信息,如姓名。原因是朋友是你所要求的关系,而不是对方的细节。如果需要人员详细信息,则必须转到人员资源,例如:
GET /people/{friend-id} [request for one friend]
GET /people?is-friend-of={id} [request for all friends]
所有好友的更新如下所示:
{ "id" : 123,
"name" : "Example Person" }
PUT /people/{id}/friends
此PUT
在正文中包含朋友的所有ID的列表
您需要实现的业务逻辑将非常容易地链接到这些单一的GET
、POST
和PUT
请求。这将使您的业务逻辑变得清晰和简单。您甚至可能发现不再需要补丁了。我已经学会了尽可能避免它,因为它带来的麻烦比它的帮助还多。RESTful指南在细节层面对补丁
动词的处理过于模糊
我建议您进一步了解RESTful的含义,一旦您有了一个真正的RESTful API,您就会发现处理业务逻辑很容易。好的开始:StackOverflow:您的对象包含其他对象的列表。从技术上讲,您处理许多对象,而不是单个对象。因此,JSON结果不是RESTful的。REST基于资源(您称之为对象),当它们不是复合物时,您通常会将它们隔离。所以当你打电话的时候
GET/people/123
,这应该而不是提供您所介绍的示例。这是嘘