代码之家  ›  专栏  ›  技术社区  ›  user266003

用于更新字段的RESTFul方法

  •  4
  • user266003  · 技术社区  · 11 年前

    我想知道,什么是更RESTFul、更灵活、更好的方法 更新 (!)a 领域 物品的(状态)

    /api/v1/items/:id?action=start 
    /api/v1/items/:id/start 
    /api/v1/items/:id/ + action in the body
    /api/v1/items/:id/status/{active|stopped}
    

    或项目

    /api/v1/items?action=start 
    /api/v1/items/start 
    /api/v1/items/ + action in the body
    /api/v1/items/status/{active|stopped}  
    
    3 回复  |  直到 11 年前
        1
  •  5
  •   Colin 't Hart    11 年前

    我更喜欢第三种API结构:

    /api/v1/items/:id/ + action in the body
    

    我的理由包括:

    • 根据 Richardson Maturity Model URL应该指向一个特定的资源或一组资源。您不希望在URL中添加更新信息,因为它不符合有效端点的条件。
    • 您希望将PUT用于影响资源的更新/替换操作。让URL选择资源,让主体定义要更新的确切字段,以及其他任何逻辑。
    • 使用主体而不是查询字符串可以插入任意大的信息(达到一定的限制,但大于查询字符串),这些信息在逻辑上可能与操作配对(在您的情况下开始)。它还允许在未来扩展操作时具有更大的灵活性。
    • 您可能可以在的响应中列出可以对端点执行的相关操作 /api/v1/items 这将是一个信息超媒体控件的列表。同样,Richardson成熟度模型提供了一个很好的例子。
        2
  •  2
  •   Orri    11 年前

    作为替代方案,您可以实施PATCH方法。它将为您提供更新选择性字段的可能性。PATCH唯一的问题是未知,因为RFC还很年轻。实际的实现取决于服务器端和客户端的库和框架。

    当您不想使用PATCH时,唯一的选择是实现overriden POST并定义更新机制。例如,您可以说:每个字段!=null将覆盖资源字段值。

        3
  •  0
  •   Community holdenweb    4 年前

    让我们重新表述这个问题: 如何更改资源的几个属性。(状态只是另一个属性)

    答案:

    识别资源。

    使用POST(因为请求是非幂等的) 主体中的供应,因为将来您可能需要更改更多的属性,而不仅仅是此资源的状态。

    岗位 /api/v1/items/:主体中的id+操作

    仅使用 岗位 方法

    原因 : 当它更改完整的财产集而不是一个或部分属性时,应使用。

    请继续。我们不需要对HTTP中的每个状态更改都使用PUT。REST从未说过我们应该这样做。 It is okay to use POST - roy t fielding