RESTAPI-更新实体之间的关系

RESTAPI-更新实体之间的关系,rest,updates,entity-relationship,Rest,Updates,Entity Relationship,以下是如何在my API中将书籍添加到作者: PUT /authors/1/books/1/ 我现在想把这本书换成另一位作者 我该怎么做?我在考虑以下选择 1-使/作者和/书籍都成为顶级资源。使用书本上的属性(例如authorId:2)控制书本的作者。例如,在正文中放置/book/1并使用其他属性设置authord:2 2-执行PUT/authors/2/books/1/,将现有作者的书更改为2。用这种方法,我应该检查这本书是否已经存在。如果存在,我将更新作者和其他属性,如果不存在,我将创建一

以下是如何在my API中将书籍添加到作者:

PUT /authors/1/books/1/
我现在想把这本书换成另一位作者

我该怎么做?我在考虑以下选择

1-使/作者和/书籍都成为顶级资源。使用书本上的属性(例如authorId:2)控制书本的作者。例如,在正文中放置/book/1并使用其他属性设置authord:2

2-执行PUT/authors/2/books/1/,将现有作者的书更改为2。用这种方法,我应该检查这本书是否已经存在。如果存在,我将更新作者和其他属性,如果不存在,我将创建一本新书


就最佳实践而言,哪一个是最佳选择?第二个选项是胡说八道吗?

两者都是唯一可识别的,因此它们都应该是各自的资源,即

GET /authors/1
GET /books/1
因此,您建议IMO的第二个选项似乎是最明智的,即

PUT /books/1

{ authorId: 2 }

两者都是唯一可识别的,因此两者都应该是各自的资源,即

GET /authors/1
GET /books/1
因此,您建议IMO的第二个选项似乎是最明智的,即

PUT /books/1

{ authorId: 2 }

好吧,让我假设一下

一本书一位作者 你已经有了这本书的id,因为它在你的声明中排在第一位,对吗 您已经有了要设置的作者id 那么,让我强加一些东西

POST /books/1
{
  op: 'set'
  entity: 'authorId'
  value: 2
}

我并不是说这是最好的做法,只是举个例子好吧,让我假设一下

一本书一位作者 你已经有了这本书的id,因为它在你的声明中排在第一位,对吗 您已经有了要设置的作者id 那么,让我强加一些东西

POST /books/1
{
  op: 'set'
  entity: 'authorId'
  value: 2
}

我并不是说这是最佳实践,只是举个例子,URI是一个标识符——从通用组件的角度来看,它在语义上是不透明的。有关资源当前状态的信息在表示中表示,而不是在标识符中表示

我现在想把这本书换成另一位作者

作为一个客户端,通常的方法是下载一本书的表示,修改本地副本以引用新作者,然后向用于获取表示的同一个目标uri发出PUT请求。PUT语义要求服务器更改服务器对目标资源的表示,以匹配客户端的表示

服务器可以将信息编码到URI中,但该信息仅供服务器使用

是的,这意味着客户端可能会对表示进行与URI中表示的语义冲突的编辑。这类似于文件名及其内容不对齐的情况

服务器理解了通用请求的语义后,就可以决定如何处理它了。合理的选择包括

拒绝请求 就地接受编辑,留下标识符和表示之间的分歧 在其他地方接受这些编辑,有效地创建或编辑新资源。
最后一个选项可能是最棘手的,因为它让一个通用客户机将其理解与服务器的更新资源模型相匹配。

URI是一个标识符——从通用组件的角度来看,它在语义上是不透明的。有关资源当前状态的信息在表示中表示,而不是在标识符中表示

我现在想把这本书换成另一位作者

作为一个客户端,通常的方法是下载一本书的表示,修改本地副本以引用新作者,然后向用于获取表示的同一个目标uri发出PUT请求。PUT语义要求服务器更改服务器对目标资源的表示,以匹配客户端的表示

服务器可以将信息编码到URI中,但该信息仅供服务器使用

是的,这意味着客户端可能会对表示进行与URI中表示的语义冲突的编辑。这类似于文件名及其内容不对齐的情况

服务器理解了通用请求的语义后,就可以决定如何处理它了。合理的选择包括

拒绝请求 就地接受编辑,留下标识符和表示之间的分歧 在其他地方接受这些编辑,有效地创建或编辑新资源。
最后一个选项可能是最棘手的,因为它需要一个通用客户机将其理解与服务器更新的资源模型相匹配。

您是说第一个选项,对吗我也喜欢这种方式。这是通常的做法还是有更好的办法?@Mars先生,是的,你提出的第一个方案。取决于你的定义
当然,更好的是,对我来说,这种方法是根据您的设置做您想要做的事情的最佳方法,对于典型的看跌期权来说是一种非常流行的解决方案。您是指第一种选择,对吗我也喜欢这种方式。这是通常的做法还是有更好的办法?@Mars先生,是的,你提出的第一个方案。取决于您对better的定义,对我来说,这种方法是在给定设置的情况下实现所需的最佳方法,对于典型的PUT,它将是一种非常流行的解决方案。