Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 对于具有嵌套的非资源路由,最佳的API设计是什么_Ruby On Rails_Ruby On Rails 4_Api Design_Rails Api - Fatal编程技术网

Ruby on rails 对于具有嵌套的非资源路由,最佳的API设计是什么

Ruby on rails 对于具有嵌套的非资源路由,最佳的API设计是什么,ruby-on-rails,ruby-on-rails-4,api-design,rails-api,Ruby On Rails,Ruby On Rails 4,Api Design,Rails Api,我正在Rails中编写一个API,它可以从多个运营商处检索包的价格。包裹的尺寸、重量、寄往地址和寄往地址都是通用的。每个运营商都有具体的细节(联邦快递:账号、包装选项;美国邮政:可加工性、预分类;UPS:通知细节等)。我仍在决定是将价格存储在本地还是从官方API检索价格 我的第一个问题是关于价格资源。我有一个价格模型,但它不是从ActiveRecord继承的,因为我没有价格表。我认为我的URL看起来像/api/v1/prices,它需要像{“length”:1.0,“address\u from

我正在Rails中编写一个API,它可以从多个运营商处检索包的价格。包裹的尺寸、重量、寄往地址和寄往地址都是通用的。每个运营商都有具体的细节(联邦快递:账号、包装选项;美国邮政:可加工性、预分类;UPS:通知细节等)。我仍在决定是将价格存储在本地还是从官方API检索价格

我的第一个问题是关于价格资源。我有一个价格模型,但它不是从ActiveRecord继承的,因为我没有价格表。我认为我的URL看起来像/api/v1/prices,它需要像
{“length”:1.0,“address\u from”:}
这样的有效负载。这是一个帖子还是一个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结构?

我仍在决定是在本地存储价格还是从官方API检索价格

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

我同意
/api/v1/prices
应该获得get请求,因为您没有在数据库或远程服务/api上创建资源。但这是单数还是复数资源?如果是单数,你应该考虑使用<代码> /API/V1/Sudio。是将价格id作为url的一部分还是作为额外参数取决于您


我更喜欢选项1的样式,因为JSON格式保留了底层模型关系。这不仅使它更易于使用,而且“自我描述”,因为数据的格式也传达了它的结构。它也不需要解析JSON键。

(1)GET(2)绝对不是第二个。我很困惑-你为什么不储存价格?如果您的假设是定价会发生变化,并且您将始终获得最新的信息,那么您将希望初始价格只是为了澄清,我将存储价格,而不会包装API调用。