Ruby on rails 向web应用程序添加小型API

Ruby on rails 向web应用程序添加小型API,ruby-on-rails,Ruby On Rails,我有一个带有一些标准路由的rails应用程序,我想在其中添加一些API端点 我想我只需要添加一些路由(可能在作用域“/api”)下),创建一些扩展ActionController::api的新控制器,然后也许可以做一些事情,让rails神奇地知道如何呈现JSON数据 有关于如何做到这一点的指南吗?我所能找到的一切都在谈论创建“仅API”应用程序,但没有讨论向现有web应用程序添加一些API端点 编辑:我专门寻找rails 5解决方案 决定API数据格式(在本例中,我们将使用JSON) 确定您的端

我有一个带有一些标准路由的rails应用程序,我想在其中添加一些API端点

我想我只需要添加一些路由(可能在
作用域“/api”
)下),创建一些扩展
ActionController::api
的新控制器,然后也许可以做一些事情,让rails神奇地知道如何呈现JSON数据

有关于如何做到这一点的指南吗?我所能找到的一切都在谈论创建“仅API”应用程序,但没有讨论向现有web应用程序添加一些API端点

编辑:我专门寻找rails 5解决方案

  • 决定API数据格式(在本例中,我们将使用JSON)
  • 确定您的端点是什么(例如,假设您正在创建一个
    products\create
    端点)
  • 决定API范围和版本控制方案(在本例中为
    v1
  • config/routes.rb
    中添加下面所示的路由
  • 在控制器目录中创建一个名为
    v1
  • v1
    目录中创建一个控制器,如下所示

    #goes in routes
    namespace 'v1', defaults: {format: 'json'} do
      resources :products, only: [:create] 
    end
    
    #controller
    module V1
      class ProductsController < ActionController::API
    
        def create
          #some code
        end
      end
    end
    
    #按路线运行
    命名空间“v1”,默认值:{format:'json'}do
    资源:产品,仅限:[:创建]
    结束
    #控制器
    模块V1
    类ProductsController
  • 随机智慧

    • 尽可能彻底地考虑你的终点。我不知道您是否计划有人使用此API,或者您是否是唯一使用此API的人,但请从使用它的角度考虑每个端点;这将为您节省大量的重构和重新设计时间
    • 在将序列化器提供给端点之前,您还应该研究使用序列化器帮助您进行对象装饰的模式
    • 确保你考虑了你想要如何处理错误,你想让它们安静地失败,你想给消费者反馈信息等等。无论你选择做什么,只要确保你是一致的
    请看下面的建议:

    经典应用程序与纯API应用程序之间的差别非常小。仅API应用程序可以扩展API中不需要的一些中间件和组件

    否则,构建实际API组件的步骤几乎相同

    首先,您需要为API控制器选择不同的超类。您的API控制器不需要ApplicationController上的所有垃圾,您将以不同的方式处理许多方面,例如身份验证

    Rails 5具有
    ActionController::API
    ,在以前的版本中,您将使用
    ActionController::Metal
    ,并包含所需的模块

    # app/controllers/api_controller.rb
    class ApiController < ActionController::API
      # Do whatever you would do in ApplicationController
    end
    
    和控制器:

    module API
      class ThingsController < ApiController
    
        before_action :set_thing, except: [:create, :index]
    
        def show
          render json: @thing
        end
    
        def index
          render json: @things = Thing.all
        end
    
        def create
          @thing = Thing.create(thing_params)
    
          if @thing.save
            head :created, location: [:api, @thing]
          else
            render json: @thing.errors, status: :bad_entity
          end
        end
        # ...
      end
    end
    
    模块API
    类ThingsController
    构建API有很多方面,比如版本控制和JSON序列化策略,你会发现很多关于这个主题的教程——只是不要只关注API部分。

    使用类似的方法

    namespace:api,默认值:{format:'json'}do

    将api控制器默认为仅呈现json

    您描述的其余部分是一个不错的实现,正是我们今天在生产中使用的。一些端点仍然是普通的rails,但大多数是api json,客户端MVC承担着繁重的工作。这是从默认rails应用程序迁移到客户端MVC时的常见用例


    另一个好方法是将您创建的基础api控制器作为api控制器的基础,该基础api控制器继承自应用程序控制器。

    这并不能回答问题。这只是一些随机的想法。嗨,谢谢,但这些似乎是针对rails 4(或者至少是低于rails 5)的,实际上并没有解决向现有应用程序添加API的问题。我正在积极编辑,很抱歉在我开始回答时rails 5的评论不在那里。我只是想澄清一下,我不知道让控制器返回JSON数据的具体步骤——我得到了路由,我假设我可以通过运行
    rails g controller my_thing
    并手动将基类更改为
    ActionController::API
    来创建控制器,但是如何添加返回JSON数据的操作呢?(我从概念上知道什么是API以及如何设计API,但不知道如何在现有rails应用程序中创建API)上面的
    ApiController
    如何与我现有的
    ApplicationController
    共存?rails如何看待它?编辑:这是因为
    名称空间的原因吗?因为您将api控制器设置为从ApiController而不是ApplicationController继承。ApplicationControlle没有什么神奇之处r在Rails中。它只是Rails生成器设置控制器以从中继承的一个类。我意识到我忘了在示例中添加
    ,我希望现在更清楚。哦,哇,我明白了,我想这可能是缺少的部分…我现在在手机上,但今天晚些时候会回来并关闭它,谢谢!e怎么样这是不是只有316个观点和之前的0票?让我震惊。这是一个很好且广泛适用的问题。
    module API
      class ThingsController < ApiController
    
        before_action :set_thing, except: [:create, :index]
    
        def show
          render json: @thing
        end
    
        def index
          render json: @things = Thing.all
        end
    
        def create
          @thing = Thing.create(thing_params)
    
          if @thing.save
            head :created, location: [:api, @thing]
          else
            render json: @thing.errors, status: :bad_entity
          end
        end
        # ...
      end
    end