Ruby on rails 向web应用程序添加小型API
我有一个带有一些标准路由的rails应用程序,我想在其中添加一些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) 确定您的端
作用域“/api”
)下),创建一些扩展ActionController::api
的新控制器,然后也许可以做一些事情,让rails神奇地知道如何呈现JSON数据
有关于如何做到这一点的指南吗?我所能找到的一切都在谈论创建“仅API”应用程序,但没有讨论向现有web应用程序添加一些API端点
编辑:我专门寻找rails 5解决方案
products\create
端点)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的人,但请从使用它的角度考虑每个端点;这将为您节省大量的重构和重新设计时间
- 在将序列化器提供给端点之前,您还应该研究使用序列化器帮助您进行对象装饰的模式
- 确保你考虑了你想要如何处理错误,你想让它们安静地失败,你想给消费者反馈信息等等。无论你选择做什么,只要确保你是一致的
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