REST API最佳路线实践

时间:2020-01-06 08:10:22

标签: rest api express server

我想知道当订单是资源时,针对以下情况创建REST API的最佳实践是什么:

  1. 获取数据库中的所有订单。 (当然,这不是实际情况,仅出于理解目的)
  2. 通过订单ID获取订单。
  3. 通过订单ID获取单个订单

•所有这些方案都可以使用一条GET路由吗?

•还是针对这些情况我们应该有单独的路线?

任何帮助将不胜感激!! (如果需要,可以使用Express JS框架)

2 个答案:

答案 0 :(得分:2)

所有这些情况都可以使用一条GET路由吗?

您可以在所有这些情况下使用一条路由:

GET /orders                              // get all
GET /orders?id=409,5678,2987             // get these orders by id
GET /orders?id=9463                      // get this order by id
GET /orders?person=jackwelch             // get orders for this person
GET /orders?company=aaWidget             // get orders for this company 

还是针对这些情况我们应该有单独的路线?

这在很大程度上取决于设计意见。通常,我喜欢将不同的URL形式的数量保持在实用范围之内,并在有意义且不会因随意拉伸而使其完全适合时,对不同的输入重载相同的路由。但最终,这是基于对您需要支持的查询的总体情况以及最有可能使用它的理解的判断。

并且请记住,要添加新订单,将使用POST并修改现有订单,将使用PUT并删除订单,然后使用DELETE

POST   /orders                    // create new order, data in body of request
PUT    /orders/:id                // modify existing order, data in body of request
DELETE /orders/:id                // delete an order

因此,所有这些都可以通过一个指向外部世界的/orders URL结构来完成。在内部,它可能被构造为几个不同的路由处理程序,只是为了使处理它的代码更简单:

app.get("/orders", ...);         // handle order queries   (use req.query)
app.post("/orders", ...);        // create new order       (use req.body)
app.put("/orders/:id", ...);     // modify existing order  (use req.params.id and req.body)
app.delete("/orders/:id", ...);  // delete existing order  (use req.params.id)

此结构的另一个好处是,它非常可扩展。您可以通过仅添加其他查询字符串参数来添加更多查询订单的方法,而无需对结构甚至任何新的路由处理程序进行整体更改。

答案 1 :(得分:0)

RESTful API使用HTTP方法作为动词。这意味着应该使用相同的端点来获取订单列表并创建一个新的订单;或获得一个特定的订单,对其进行更新或将其删除。

考虑到这一点,您可以按照以下方式设计API结构:

GET       /orders        // To get a list of all orders
GET       /orders/:id    // To get information about a specific order

这将帮助您轻松地添加更多方法,而无需更改API设计:

POST     /orders         // To create a new order
PUT      /orders/:id     // To update that specific order
DELETE   /orders/:id     // To delete it

如果要在端点上添加搜索功能,则使用查询字符串是很常见的。例如:

GET   /orders?email=john@example.org  // To retrieve all orders from that customer
GET   /orders?limit=10                // To retrieve only 10 hits per results
GET   /orders?limit=10&total=99.99    // To retrieve top 10 orders with a total of 99.99

您可以添加专用的搜索参数以按ID退回订单(根据要求),但是这种情况并不常见,因为您已经可以使用端点/orders/:id通过ID进行查询。您可能会考虑在这里避免额外的请求,但是通常来说,性能提升非常低-除非对您的应用程序通过ID多次命中检索至关重要。