什么是具有嵌套的非资源路由的最佳API设计

时间:2016-04-05 01:31:59

标签: ruby-on-rails ruby-on-rails-4 api-design rails-api

我在Rails中编写API,从多个运营商处检索包裹的价格。通常根据尺寸,重量,地址和地址来描述包。每个承运人都有具体的细节(联邦快递:账号,包裹选项; USPS:可加工性,预分类; UPS:通知详情等)。我还在决定是否应该在本地存储价格或从官方API中检索它们。

我的第一个问题是 price 资源。我确实有一个 Price 模型,但由于我没有价格表,因此它不会继承ActiveRecord。我认为我的网址看起来像是 / 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构造吗?

1 个答案:

答案 0 :(得分:1)

我仍在决定是否应该在本地存储价格或从官方API中检索它们。

真的好问题。如果价格在未来发生变化怎么办?您的应用是否取决于API调用时的价格?如果是这样,您肯定应该在本地存储,因为价格可能会因API调用而异。如果有疑问,我会存储此值,以便您稍后有一个文件记录用于审计目的。

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

我更喜欢选项1的样式,因为JSON格式保留了基础模型关系。这不是使它更容易使用,也是“自我描述”,因为数据格式也传达了它的结构。它也不需要解析JSON密钥。