rest - 应用程序服务调用的正确 RESTful URL 约定?

标签 rest

我已经看到了大量关于如何为基本 CRUD 操作构造 URL 的示例,但在谈论更多类似命令的操作或应用程序服务调用时却很少看到。

例如,假设在我的应用程序服务中,我有一个类似 RemoveOldOrders(int customerId) 的调用,它会从系统中删除任何订单,该订单对于 ID 为“customerId”的客户来说已经超过 2 年了。我的 Restful 服务中的 URL 会是什么样子?调用的有效载荷是什么样的?我会使用什么 HTTP 方法(POST?)?

我的想法是它会是这样的:

/Customer/1/RemoveOldOrders 作为 POST,带有空正文(因为 customerID 将来自 url)。

是否有关于此类事情的良好指导方针?

更新:我觉得我需要澄清一下我的问题,而不是关于可能重复的帖子的评论(是的,那个帖子问的基本上是同一件事,但我真的觉得这个问题没有得到很好的回答)。

如果我想对资源执行操作但该操作不适合标准 HTTP 动词怎么办?

另一个例子:我的应用程序连接到 ESB 并且需要有一种方法来强制将我的资源投影到 ESB 上进行处理?在我当前的基于 SOAP 的 Web 服务中,我有一个类似的方法:

ExportCustomer(int customerId)

现在,在 RESTful 服务的情况下,我如何在 uri 中表示此操作? Brian Kelly 的答案中的选项 1 似乎是最合乎逻辑的,例如:
POST http://someapp/api/customer/1/export

或者会:
POST http://someapi/api/customer/export/1

会更好?

最佳答案

任何时候你想对像“remove”这样的动词建模,你应该想到 DELETE .同样,对于“创建”认为 POST (和/或可能 PUT),对于“阅读”认为 GET和“更新”认为 PUT (或者也许 PATCH )。

因此,对于“删除旧订单”的示例,您绝对应该使用 DELETE .现在您唯一剩下的挑战是如何确定应该删除的订单。一旦你弄清楚了,URI 方案就会随之而来。

以下是一些选项:

  • DELETE http://your-api.com/old-orders
    这里old-orders的含义和范围将由接收此请求的服务器确定。这使客户端不必这样做,但消除了他们更改该范围的能力。
  • GET http://your-api.com/order-query?days-older-than=730
    这将返回 Location http://your-api.com/order-query-result/{some ID} 的 URI表示旧约会集。然后,您可以简单地对该 URI 发出 DELETE 以一举清除旧记录。
  • 不要强制客户端记住发出这种类型的删除命令,而是提供某种 configuration可以通过您的 API 操作的资源以设置一些字段,例如 purgeRecordsOlderThanDays=730 ,然后让服务器在 cron 中为您自动执行此操作- 喜欢时尚。那将是我的首选方法。
  • 关于rest - 应用程序服务调用的正确 RESTful URL 约定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9910906/

    相关文章:

    java - 如何验证 REST 服务中的传入 JSON 数据?

    c# - 在 Web API 2 中找不到方法

    rest - 请求的资源上不存在 'Access-Control-Allow-Origin' header -Resteasy

    REST API 检查对象是否存在

    JSON 与表单 POST

    spring - 服务和 Controller 层异常处理设计模式

    api - 常量 'in' 值轻松作为 REST API 值

    java - 多个 Java 对象到单个端点

    使用 Spring Boot : Allowing unauthenticated user access on specific endpoints when using a filter 的 Spring Security

    java - Jax-rs 在数据库操作之前返回响应