Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在RESTAPI中处理更新?_Rest_Api - Fatal编程技术网

如何在RESTAPI中处理更新?

如何在RESTAPI中处理更新?,rest,api,Rest,Api,我想了解一些使用RESTful API执行写操作的方法。对于本例,假设一个Person对象: { "id": 1, "name": "Example Person", "addresses": [ { "id": 11, } ], "friends": [ { "id": 21, "name": "John" }

我想了解一些使用RESTful API执行写操作的方法。对于本例,假设一个Person对象:

{
    "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
,这应该而不是提供您所介绍的示例。这是嘘