对于带嵌套的非足智多谋的路线,最好的 API 设计是什么

what is the best API design for a non-resourceful route with nesting

我正在 Rails 中编写一个 API,它从多个运营商处检索包裹的价格。包裹通常根据尺寸、重量、发件人地址和收件人地址来描述。每个承运人都会有具体的细节(FedEx:账号、包裹选项;USPS:可加工性、预分类;UPS:通知细节等)。我仍在决定是应该将价格存储在本地还是从官方 APIs.

中检索它们

我的第一个问题是关于 价格 资源。我确实有一个 Price 模型,但它不是从 ActiveRecord 继承的,因为我没有 prices table。我在想我的 URL 看起来像 /api/v1/prices 并且需要像 { "length" : 1.0, "address_from" : ... } 这样的有效负载。这应该是 POST 还是 GET?我猜是 GET,因为我实际上并没有创建资源,但我不确定。

我的第二个问题是关于负载的。我应该嵌套特定于运营商的数据吗?换句话说,哪种方式看起来更正确(从 RESTful 的角度和易用性的角度)?
选项 1:

{ "length" : 1.0, ..., "carrier" : { "name" : "FedEx", "account_number" : "123ABC", "package_options" : "XXX", ... } }

选项 2:

{ "length" : 1.0, ..., "carrier" : "FedEx", "fedex_account_number" : "123ABC", "fedex_package_options" : "XXX", ... }

如果是选项 1,我是否应该创建某种资源嵌套,是否应该更改我的 URL 结构?

我还在考虑是把价格存储在本地还是从官方 APIs 中检索。

真是个好问题。如果未来价格发生变化怎么办?您的应用程序是否取决于拨打 API 电话时的价格?如果是这样,您绝对应该将其存储在本地,因为价格可能因 API 次调用和 API 次调用而异。如果有疑问,我会存储这个值,以便您以后有用于审计目的的书面记录。

我同意 /api/v1/prices 应该收到 GET 请求,因为您没有在您的数据库或远程 service/API 上创建资源。但这是单数资源还是复数资源?如果它是单数,你应该考虑使用 /api/v1/price。您是将价格 ID 作为 url 的一部分还是作为额外参数由您决定。

我更喜欢选项 1 的样式,因为 JSON 格式保留了底层模型关系。这并没有使它更容易使用,而且 "self-describing" 因为数据的格式也传达了它的结构。它也不需要解析 JSON 键。