Json RESTful API设计,在更新资源时区分PUT操作

Json RESTful API设计,在更新资源时区分PUT操作,json,web-services,rest,asp.net-web-api,Json,Web Services,Rest,Asp.net Web Api,这是一个通用的RESTful API设计问题。我们正试图用最常见的方法解决以下情况 我们有一个资源,比方说:/licenses/5123 该资源的过期日期需要更新为过期状态。当然,最简单的方法是公开过期日期,并让客户机将其设置为新日期,但这是不需要的。 要更新资源,我们使用PUT方法,并希望指定此更新的类型。换句话说,更新操作是“过期”还是“扩展”或“随便什么” 我考虑了几个选择: 实现自定义http方法-但我不喜欢将http协议扩展到其标准之外 添加操作url参数并指定值:PUT/licens

这是一个通用的RESTful API设计问题。我们正试图用最常见的方法解决以下情况

我们有一个资源,比方说:/licenses/5123 该资源的过期日期需要更新为过期状态。当然,最简单的方法是公开过期日期,并让客户机将其设置为新日期,但这是不需要的。 要更新资源,我们使用PUT方法,并希望指定此更新的类型。换句话说,更新操作是“过期”还是“扩展”或“随便什么”

我考虑了几个选择:

  • 实现自定义http方法-但我不喜欢将http协议扩展到其标准之外
  • 添加操作url参数并指定值:PUT/licenses/5123?action=expire
  • 由于在JSON格式的请求体中还有其他参数,因此将action param添加到JSON请求中
  • 实现此更新类型的自定义http标头
  • 请分享您的观点和/或提供可能描述此类案例的在线资源的任何参考资料。我无法想象这是一个独特的案例


    多谢各位

    通常首选方案2和3。没有必要对HTTP操作或自定义头执行自定义操作


    PUT是更新许可证的合理操作方法,如您所述。将更新的详细信息放在JSON请求正文中听起来很合理(选项3),我也会这么做。

    通常,选项2和3是首选。没有必要对HTTP操作或自定义头执行自定义操作


    PUT是更新许可证的合理操作方法,如您所述。将更新的详细信息放在JSON请求正文中听起来很合理(选项3),我会这么做。

    选项2是我的首选

    我认为使用选项2是我常见的最佳实践,它干净、高效且可读。大多数时候,我都在努力提高可读性和可维护性,因为我可能不是将来调试、修复或扩展代码的开发人员

    使用HTTP协议或标头做任何事情都感觉像是“黑客”。我认为这是超越和超越,将需要更多的努力比问题是最有可能值得的(这废品解决方案1和4)


    选项3的一个潜在问题是,您可能会将业务逻辑与数据混淆,从而导致耦合和潜在的升级问题。

    选项2是我的首选

    我认为使用选项2是我常见的最佳实践,它干净、高效且可读。大多数时候,我都在努力提高可读性和可维护性,因为我可能不是将来调试、修复或扩展代码的开发人员

    使用HTTP协议或标头做任何事情都感觉像是“黑客”。我认为这是超越和超越,将需要更多的努力比问题是最有可能值得的(这废品解决方案1和4)


    选项3的一个潜在问题是,您可能会将业务逻辑与数据混淆,从而导致耦合和潜在的升级问题。

    那么“子资源”呢?您可以使用
    PUT/licenses/5123/expire
    发送
    true
    。有趣的想法是,expire是一个动词,应该避免。好吧,只需根据您的需要命名子资源(
    expirement\u date
    expired
    ),那么“子资源”呢?您可以使用
    PUT/licenses/5123/expire
    发送
    true
    。有趣的想法是,expire是一个动词,应该避免。好吧,只需根据需要命名子资源(
    expire\u date
    expired
    )。您是否介意解释一下为什么更喜欢选项2?这似乎很快就会变得复杂起来。假设您有一个邮箱,您可以对邮件执行各种操作,如将邮件标记为已读、更改邮件类别、存档邮件以及选择稍后提醒。REST优于RPC的优点之一是,客户端不需要知道过程名称,但这样做您仍然需要知道它们。在这一点上,为什么不让它们单独执行HTTP操作(例如
    POST/messages/45434/archive
    ),以使实现更简单(避免
    if action==“…”
    )和更清晰?我的理解是,REST应该基于资源。一个动作并没有对资源元的真正引用,它只是定义一个动作,比如工作流状态的改变
    /messages/45434/archive
    对我来说,不清楚您是否正在存档给定的邮件,它的意思是存档将是某个子集或子项。我想我的意思是,RESTful路径不一定包含业务逻辑和交互路径(工作流),即“归档”路径。如果更清楚的话,我的经验法则是路径是名词,参数查询是动词。名词和路径在某种程度上属于模型。动词属于控制器,因此是如何处理模型的指令,例如存档。在rest方面,您的标准put和patch等定义了一个较低级别的交互,与任何业务逻辑无关,例如创建和编辑。您介意解释一下为什么您更喜欢选项2吗?这似乎很快就会变得复杂起来。假设您有一个邮箱,您可以对邮件执行各种操作,如将邮件标记为已读、更改邮件类别、存档邮件以及选择稍后提醒。REST优于RPC的优点之一是,客户端不需要知道过程名称,但这样做您仍然需要知道它们。在这一点上,为什么不让它们单独执行HTTP操作(例如
    POST/messages/45434/archive
    ),以使实现更简单(避免
    if action==“…”
    )和更清晰?我的理解