Rails 路由的 API 版本控制

2023-12-29

我正在尝试像 Stripe 那样对我的 API 进行版本控制。下面给出的最新 API 版本是 2。

/api/users返回 301/api/v2/users

/api/v1/users返回版本 1 的 200 个用户索引

/api/v3/users返回 301/api/v2/users

/api/asdf/users返回 301/api/v2/users

因此,基本上任何未指定版本的内容都会链接到最新版本,除非指定的版本存在,然后重定向到它。

这是我到目前为止所拥有的:

scope 'api', :format => :json do
  scope 'v:api_version', :api_version => /[12]/ do
    resources :users
  end

  match '/*path', :to => redirect { |params| "/api/v2/#{params[:path]}" }
end

这个答案的原始形式有很大不同,可以在这里找到 https://stackoverflow.com/revisions/9627796/2。只是证明剥猫皮的方法不止一种。

我已经更新了答案,因为使用命名空间并使用 301 重定向——而不是默认的 302。感谢 Pixeltrix 和 Bo Jeanes 对这些事情的提示。


你可能想穿really坚固的头盔,因为这将意乱情迷.

Rails 3 路由 API 非常邪恶。要根据上述要求为您的 API 编写路由,您只需要这样:

namespace :api do
  namespace :v1 do
    resources :users
  end

  namespace :v2 do
    resources :users
  end
  match 'v:api/*path', :to => redirect("/api/v2/%{path}")
  match '*path', :to => redirect("/api/v2/%{path}")
end

如果您的思想在此之后仍然完好无损,请让我解释一下。

首先,我们调用namespace当您想要将一堆路由范围限定为类似名称的特定路径和模块时,这非常方便。在这种情况下,我们希望我们的块内的所有路线namespace范围内的控制器Api模块和对该路由内的路径的所有请求都将带有前缀api。请求如/api/v2/users,你知道吗?

在命名空间内,我们又定义了两个命名空间(哇!)。这次我们定义了“v1”命名空间,因此这里控制器的所有路由都将位于V1模块内的Api模块:Api::V1。通过定义resources :users在此路线内,控制器将位于Api::V1::UsersController。这是版本 1,您可以通过发出如下请求来到达该版本/api/v1/users.

版本 2 只是一个tiny有点不同。而不是服务它的控制器位于Api::V1::UsersController,现在是在Api::V2::UsersController。你可以通过提出如下请求来到达那里/api/v2/users.

Next, a match用来。这将匹配所有 API 路由,例如/api/v3/users.

这是我必须查找的部分。这:to =>选项允许您指定应将特定请求重定向到其他地方 - 我知道这么多 - 但我不知道如何让它重定向到其他地方并随它一起传递原始请求的一部分。

为此,我们调用redirect方法并向其传递一个带有特殊插值的字符串%{path}范围。当收到与此最终匹配的请求时match,它将插入path参数到的位置%{path}在字符串内并将用户重定向到他们需要去的地方。

最后我们用另一个match路由所有剩余的前缀为/api并将它们重定向到/api/v2/%{path}。这意味着像这样的请求/api/users将会去/api/v2/users.

我不知道如何获得/api/asdf/users匹配,因为你如何确定这是否应该是一个请求/api/<resource>/<identifier> or /api/<version>/<resource>?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails 路由的 API 版本控制 的相关文章

  • Angular 2 获取当前路线

    所以我需要以某种方式检查我是否在主页上执行某些操作 而在其他页面上则不执行此操作 该组件也在所有页面上导入 如果我在主页上 如何检测该组件 Thanks 尝试这个 import Router from angular router expo
  • RoR - Rails 中的大文件上传

    我有一个 Rails Web 应用程序 允许用户上传视频 视频存储在 NFS 安装的目录中 当前的设置适用于较小的文件 但我也需要支持大文件上传 最多 4GB 当我尝试上传 4GB 文件时 它最终会发生 但从用户体验的角度来看很糟糕 上传开
  • 我可以将 MAMP (MySQL) 或 XAMPP (MySQL) 与 Ruby on Rails 3 一起使用吗?

    我可以将 MAMP MySQL 或 XAMPP MySQL 与 Ruby on Rails 3 一起使用吗 我从 MYSQL com 安装了 MySQL 但遇到了很多麻烦 所以我喜欢使用 MAMP XAMPP Mysql 有人这样做吗 另外
  • 服务器上的 Rails 会话

    我想让一些 Rails 应用程序在不同的服务器上共享同一个会话 我可以在同一服务器内完成此操作 但不知道是否可以在不同服务器上共享 有人已经做过或者知道怎么做吗 Thanks Use the 数据库会话存储 https github com
  • 从父应用程序重新打开 Rails 3 引擎类

    就目前而言 您无法重新打开引擎中包含的引擎类 app只需在父应用程序的目录中添加相同的类即可 app目录 例如 my engine app controllers users controller rb my app app control
  • 我想要一个默认选择空白值的日期选择框

    我用了以下date select助手 但没有一个显示默认情况下选择空白值的日期选择框 通过以下所有代码 我得到了选择框 但选择了当前日期 我在 Rails 2 3 2 上
  • Rails/Ruby 合并两个具有相同键、不同值的哈希值

    我有两个想要合并的哈希值 它们看起来像这样 Hello gt 3 Hi gt 43 Hola gt 43 第二个哈希看起来像 Hello gt 4 Hi gt 2 Bonjour gt 2 我想合并这两个哈希数组 使结果看起来像 Hello
  • Rails 3:如何让用户在表单中至少选择一个复选框?

    我有一个表单 用户在提交表单之前必须选中至少一个复选框 有没有任何插件可以处理这个问题或者jquery可以应用于我的表单 不幸的是我完全是一个 jquery 菜鸟 上面的所有答案都显示了如何在客户端执行此操作 这确实可能更好 正如您的问题标
  • 运行规范时设计 2.0“layout_by_resource”弃用警告

    我正在使用 Rails 3 2 0 和 Devise 2 0 0 rc2 当我运行规范时 我收到一条弃用警告 当我正常启动 Rails 服务器时不会看到该警告 rake DEPRECATION WARNING Layout found at
  • 带有 git Remote 的 Gem 文件在 Heroku 推送上失败

    我的 gemfile 中有以下行 gem client side validations git gt email protected cdn cgi l email protection Dakuan client side valida
  • Rails 中的嵌套布局

    Rails 3 2 中可以嵌套布局吗 我想创建 application html erb 使用的通用布局 并允许应用程序中的几个视图使用它 我找到了嵌套布局 https github com eric nested layoutsruby
  • 自动保存笔记本(或mathematica中的其他类型文件)文件

    我现在有时会遇到这个问题 部分原因是 Microsoft Office 自动保存您正在使用版本和自动恢复处理的文件 很多时候 当我在mathematica中启动一个新笔记本来做一些测试或其他事情时 我经常忘记保存我正在做的事情 时不时地 根
  • 如何配置database.yml以部署到Heroku

    我最近升级到了最新版本的Rails 并且不明白如何将应用程序部署到Heroku 这是我的database yml file default default adapter postgresql pool 5 timeout 5000 dev
  • Travis-CI 上的 Rails 数据库设置

    我正在尝试在 Rails 项目上使用 Travis 持续集成 文档说 对于 SQLite3 测试数据库必须配置如下 test adapter sqlite3 database memory timeout 500 但我想保留本地测试的默认配
  • 如何准确地衡量加载模型所需的时间?

    我想对加载模块 find by id 234 调用 所需的时间进行基准测试 另外 我如何跟踪加载页面所需的时间 我知道我在运行 Rails 服务器时得到此信息 但这是在调试模式下 我想要生产速度基准 可能吗 为了快速检查 我强烈建议检查基准
  • 如何通过 ajax 加载页面后显示 Twitter / Facebook / Google+ 按钮?

    我有一个 Rails 3 1 应用程序 我希望允许用户通过 Twitter Google 和 Facebook HTML5 版本的 Like 按钮 共享项目 我让它在项目的显示页面上工作得很好 即 仅显示该项目 但我在通过 Ajax 加载列
  • RSpec 无法从 Factorygirl 中找到工厂

    我将在 Rails3 项目中将 RSpec 与 Factory Girl 一起使用 我已经安装了 Factory Girl 但它找不到工厂我有这个错误 Failure Error Factory build user should be v
  • 如何在实际作业中引用活动的delayed_job

    我正在研究一个解决方案来显示延迟作业的完成百分比 使用delayed job gem 目前 我的delayed jobs 表的数据库迁移如下所示 class CreateDelayedJobs lt ActiveRecord Migrati
  • 在 Gorilla Mux 中嵌套子路由器

    我一直在使用gorilla mux https github com gorilla mux满足我的路由需求 但我注意到一个问题 当我嵌套多个子路由器时它不起作用 这是示例 func main r mux NewRouter StrictS
  • 如果即使对于开源项目,rails 项目的任何源代码也应该被隐藏怎么办? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 这是一个很难寻找的东西 如果我有一个开源 Rails Web 应用程序项目 其源代码是公开托管的 例如在 GitHub 上 如果该应用

随机推荐

  • Add() 方法为 Code-First 实体框架中的链接模型添加重复行

    以下是将贷款请求添加到数据库的操作 HttpPost public ActionResult Add Models ViewModels Loans LoanEditorViewModel loanEditorViewModel if Mo
  • 如何在 PDO 准备语句中使用 LIKE 子句? [复制]

    这个问题在这里已经有答案了 我有一个这样的sql查询 SELECT FROM tbl name WHERE title Like needle 当我使用此语句手动查询 MySQL 数据库时 它起作用了 但是当我将它与 PDO 一起使用并使用
  • 在 Windows 上安装 git:Git Bash Here 或 git-cheetah shell 扩展?

    我正在 Windows XP 上安装 Git 在安装过程中 安装程序会询问我是否想要 1 上下文菜单条目 Git Bash Here 以及 Git GUI Here 选项 or 2 git cheetah shell 扩展 仅限 32 位
  • Pyspark:自定义窗口函数

    我目前正在尝试提取 PySpark 数据框中连续出现的一系列事件 并对它们进行排序 排名 如下所示 为了方便起见 我已通过以下方式对初始数据框进行了排序 user id and timestamp df ini user id timest
  • 移位是 O(1) 还是 O(n)?

    是否轮班操作O 1 or O n 计算机通常需要更多的操作来移动 31 位而不是移动 1 位 这是否有意义 或者说这是否有意义操作次数换档所需的是constant不管我们需要转移多少地方 PS 想知道是否hardware是一个合适的标签 某
  • 使用 AWS amplify 和 graphql 创建新用户时出现“未经授权”错误

    所以我认为这个问题来自于我不太理解 AWS cognito 用户池和 graphql 模式中的身份验证规则之间的关系 当我运行下面的代码时 我收到消息 未授权访问 User 类型上的 createUser import React from
  • 从模板中获取 Django 表单小部件的类型

    我正在迭代表单的字段 对于某些字段 我想要稍微不同的布局 需要更改 HTML 为了准确地做到这一点 我只需要知道小部件类型 它的类名或类似的名称 在标准 python 中 这很容易 field field widget class name
  • AS3中dispatchEvent()可以带参数吗?

    看这个例子 addEventListener myEventType myFunction argument function myFunction args String Function return function evt Even
  • 使用 Json.NET 读取大整数

    我有一些带有巨大整数的 json 大约有几百位数字 我想将它们解析为 BouncyCastle 的BigInteger https github com onovotny BouncyCastle PCL blob pcl crypto s
  • 如何在 Mac Os X 上将用户添加到 apache 组?

    我实际上正在尝试在我的 MacBook Pro Mac OS X 10 6 上运行 Symfony2 当我通过 apache 启动应用程序时 所有缓存和日志文件都是由 www www 用户 组创建的 但是 我已经必须使用我自己的用户在 CL
  • 使用 rvest 跟随带有相对路径的“下一个”链接

    我正在使用rvest从页面中抓取信息的包http www radiolab org series podcasts http www radiolab org series podcasts 抓取第一页后 我想点击底部的 下一步 链接 抓取
  • 可以将PreparedStatement.addBatch()用于SELECT查询吗?

    想象一下 我有 100 个 SELECT 查询 它们因一个输入而异 可以使用PreparedStatement 作为该值 我在网上看到的所有文档都是关于批量插入 更新 删除的 我从未见过用于 select 语句的批处理 这可以做到吗 如果是
  • 有哪些好的实体框架替代品[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我现在正在使用实体框架 并且经常需要编写内联sql 因为实体框架不支持全文搜索和其他功能 是否有一个 ORM 具有许多支持高级查询的功能
  • Wix 和 .NET Framework(先决条件)

    当客户端计算机上尚未安装所需的 NET Framework 时 如何让 Wix 包下载该包 我已经有条件检查已安装的 NET 版本 但我不确定如何在找不到时下载并安装它 ClickOnce 通过检查属性页中的先决条件自动执行此操作 由于一些
  • android-viewflipper 的简单淡出和淡入动画

    我是android新手 对android动画了解不多 我有一个取景器 我想在其中的图像之间制作动画 这是代码 runnable new Runnable public void run handler postDelayed runnabl
  • Oracle,向字符串(不是数字)添加前导零

    我正在使用 Oracle 工作空间是 TOAD 我需要将字符串设置为短接 10 个字符 然后添加前导零以使它们全部为 10 位数字字符串 例如 如果我有一个像这样的字符串 12H89 需要是 0000012H89 或者 1234 变为 00
  • C++中**是什么意思? [复制]

    这个问题在这里已经有答案了 例如 bool insertInFront IntElement head int data IntElement newElem new IntElement if newElem return false n
  • Google 通讯录 api (gdata) 同步低分辨率照片

    我正在使用 google 联系人 api gdata 在 google 联系人中设置联系人的照片 我正在使用 fiddler 我看到请求是根据Google 通讯录示例 https developers google com google a
  • Angular Spectator setInput 不适用于非字符串输入

    我已经成功地将我的项目转换为使用 Jest 代替 Karma Jasmine 并且我有很多测试运行得很好 我正在尝试使用 Spectator 5 2 1 进行一个非常简单的测试 但它不起作用 我正在尝试测试使用 mat table 呈现表格
  • Rails 路由的 API 版本控制

    我正在尝试像 Stripe 那样对我的 API 进行版本控制 下面给出的最新 API 版本是 2 api users返回 301 api v2 users api v1 users返回版本 1 的 200 个用户索引 api v3 user