REST API路线最佳实践

REST API路线最佳实践,rest,api,express,server,Rest,Api,Express,Server,我想知道当订单是资源时,为以下场景创建REST API的最佳实践是什么: 获取数据库中的所有订单。(当然不是实际情况,只是为了理解目的) 通过订单ID获取订单 按订单ID获取单个订单 •所有这些场景都可以使用单一GET路线吗 •或者我们应该为这些场景设置单独的路线 任何帮助都将不胜感激!!(如果有必要,可以使用Express JS框架) 对于所有这些场景,是否可以使用单个GET路由 对于所有这些场景,您可以使用单个路由: GET /orders

我想知道当订单是资源时,为以下场景创建REST API的最佳实践是什么:

  • 获取数据库中的所有订单。(当然不是实际情况,只是为了理解目的)
  • 通过订单ID获取订单
  • 按订单ID获取单个订单
  • •所有这些场景都可以使用单一GET路线吗

    •或者我们应该为这些场景设置单独的路线

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

    对于所有这些场景,是否可以使用单个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)
    

    这种结构的另一个优点是,它具有很强的可扩展性。您可以添加更多查询订单的方法,只需添加额外的查询字符串参数,而不需要对结构进行总体更改,甚至不需要任何新的路由处理程序。

    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查询订单。您可能会考虑在这里避免额外的请求,但一般来说,性能增益非常低-除非通过IDs检索几次命中对您的应用程序至关重要。

    谢谢您的回答@jfriend00。但是,在GET/orders/id/40956782987-->GET/orders的情况下,我们不应该实际使用查询参数而不是普通参数吗?ids=40956782987RESTful API使用HTTP方法作为动词。因此,
    /orders/all
    对REST不友好。见详细答复below@ZeeshanShamsuddeen-经过进一步思考,我更新了我的答案,并展示了Express route处理程序的示例。