0

我正在构建具有发票的 REST 端点。我需要在 3 个描述级别中构建所有发票的列表(详细信息是默认的,仅汇总,一个包含客户信息)。

我还需要为单个发票构建端点,其中将包含更多信息。

我刚在想

GET /invoices               <-- detailed
GET /invoices?mode=sums     <-- sums
GET /invoices?mode=customer <-- sums
GET /invoices/TNTV002793849 <-- individual invoice

但我看到其他人可能实现了两个不同的

GET /invoices/detailed     <-- detailed
GET /invoices/sums         <-- sums
GET /invoices/customer     <-- sums
GET /invoice/TNTV002793849 <-- individual 

我已经从阅读中知道,所有这些都可以算作 REST,如果有什么我需要用链接制作一个,那么它就是 HATEOAS,我没有真正需要它的理由。

我的问题更多是从实际的角度来看,例如哪个更容易实施、更安全、更常见。

我可能会在服务器上使用 python 和 Flask,如果这很重要,我编写的一个客户端将是 JQuery。

4

1 回答 1

0

正如你自己提到的,这并不重要。因此,接下来的内容主要是一种观点。

使用/invoice/TNTV002793849and的警告/invoices/是,对于同一个概念,您有 2 个不同的命名空间。我认为这有点不寻常和出乎意料。能够删除 url 的最后一部分并获得一个合乎逻辑的父级是很好的。

所以我会选择使用相同的顶级命名空间。我个人也会对所有内容使用“单数”而不是复数形式,但这也只是一种温和的偏好。

那么问题仍然存在,如果所有内容都使用“发票”前缀,那么您应该同时拥有/sums/TNTV002793849。最大的问题是,会不会发生碰撞?你能有一张名为sums. 如果这是真的,那么这是一个很难的否定。

如果?mode=sums?mode=customer模式 与 parent 非常相同的数据/invoices,您可能还想使用内容协商。如果它们完全不同,那么我会觉得这?mode=不太合适,只会有完全独立的端点。

所以所有这些加在一起,会导致我:

GET /invoice               <-- full list of invoices
GET /invoice/{id}          <-- a specific invoice
GET /invoice-summary       <-- Some report
GET /customer/{id}/invoice <-- All invoices for a specific customer

我不知道所有这些猜测都特别适用于你,但我希望这里有足够的信息让你对自己的决定充满信心。

于 2020-02-02T23:15:52.280 回答