如果资源与其他资源有关系,如何设计RESTful API?

如果资源与其他资源有关系,如何设计RESTful API?,rest,transactions,Rest,Transactions,假设我有两个资源,Account和User。当有新用户注册时,发送到/account的帖子将创建一个帐户。但是帐户和用户之间存在如下关系: 用户属于帐户 帐户有许多用户 用户是帐户中的外键约束(即,没有用户,我无法创建帐户) 因此,对/account的POST请求将创建帐户和用户。在这种情况下,由于我创建/修改了2个资源而不是一个资源,这是否违反了RESTful原则 为了便于讨论,假设必须在事务中创建帐户和用户(即,如果用户未能创建,则也不会创建帐户) 如何设计一个RESTful API来修改与

假设我有两个资源,
Account
User
。当有新用户注册时,发送到
/account
的帖子将创建一个帐户。但是
帐户
用户
之间存在如下关系:

  • 用户
    属于
    帐户
  • 帐户
    有许多
    用户
  • 用户
    帐户
    中的外键约束(即,没有
    用户
    ,我无法创建
    帐户
  • 因此,对
    /account
    的POST请求将创建
    帐户
    用户
    。在这种情况下,由于我创建/修改了2个资源而不是一个资源,这是否违反了RESTful原则

    为了便于讨论,假设必须在事务中创建
    帐户
    用户
    (即,如果
    用户
    未能创建,则也不会创建
    帐户


    如何设计一个RESTful API来修改与其他资源有关系且必须在单个事务中发生的资源?

    对于更新其他资源的一个资源更新,没有REST原则,但您应该在响应中通知客户端更新的资源

    考虑以下几点(我引用了菲尔丁的话):
    资源是到一组实体的概念映射,而不是在任何特定时间点对应于映射的实体

    假设有一个资源
    /last\u user
    ,它返回有关请求另一个资源
    /book\u info
    信息的最后一个用户的信息。现在,只要客户端使用
    /book\u info
    ,就会更新资源
    /last\u user
    ,而此更新甚至不是通过
    /last\u user
    资源完成的

    关于更新其他资源的资源更新的设计,请考虑以下内容:

    • “任何可以命名的信息都可以是资源”,包括“其他资源的集合”
    • “REST将所有控件状态集中到响应交互而接收的表示中。”
    • “默认情况下,对检索请求的响应是可缓存的,而对其他请求的响应是不可缓存的。”“组件可以通过包含将交互标记为可缓存、不可缓存或仅在有限时间内可缓存的控制数据来覆盖这些默认值。”
    实际上,在post响应中包含更新资源(如创建的帐户和用户)的(完整)详细信息,并注明“可缓存”。有关此实践的更多信息,请参阅和相关问题


    单一事务要求是服务器端实现细节,我认为在大多数情况下,资源的创建和/或更新将导致单个数据库事务,涉及多个(相关)数据库记录(例如审计记录)的创建和/或更新.

    我不确定从你的解释中我是否理解了
    帐户
    用户
    之间的关系。无论如何,您可以将
    user
    视为一个属性。即,使用嵌入的
    用户创建资源
    帐户
    ,这只是另一个属性。希望能有帮助。