有没有办法使用rails-api gem API添加JSON分页?
我希望能够获取前50个用户,然后在另一个呼叫中从第50个用户开始,再获得50个用户.
像这样的东西:
url.com/api/v1/users?start=50
我正在使用 Rails 构建一个 API,其中有一些我可能想要用于管理目的的页面。我提供的其中一个模型被称为“an”,asset因为它就是这样的。
rake routes问题是,在使用和从 API 获取资产时,所有路由都正确显示,这很好,但当我尝试PUT更新资产时,它会失败,方法不允许。我尝试更改名称,Rails 与其他任何东西都很好。
如何在不重命名模型或使用别名路由的情况下解决此问题?
在我的 Rails API 中,我添加了一个初始化程序,它将把 JSON 输入的键从蛇形大小写更改为下划线分隔。就像这样:
ActionDispatch::Request.parameter_parsers[:json] = -> (raw_post) {
data = ActiveSupport::JSON.decode(raw_post)
data = {:_json => data} unless data.is_a?(Hash)
data.deep_transform_keys!(&:underscore)
}
Run Code Online (Sandbox Code Playgroud)
现在,某些 API 将通过标头传递:content-type: multipart/form-data而不是application/json
我想对这样的 API 做同样的事情。即添加一个初始化程序来转换参数中键的大小写。
我尝试过ActionDispatch::Request.parameter_parsers[:form_data],但没有成功。
我怎样才能实现这个目标?
在 Rails API 应用程序中,我们没有现成的 CSRF 保护。特别是,不建议将访问令牌(例如 JWT)存储在 localStorage 中,建议存储在 cookie 中(带有 httpOnly 标志、SameSite 等)。但这一次我们很容易受到潜在的 CSRF 攻击。在全栈生成的 Rails 应用程序中,每次打开表单时都会生成并嵌入一个 CSRF 令牌。但是,我不知道也找不到任何我们如何在 Rails API 应用程序中使用令牌来防止 CSRF 的信息。我们有最佳实践吗?或者有人可以建议一种方法吗?我使用访问和刷新 JWT。
使用rails-api:
def show
render json: Room.find(params[:id])
end
Run Code Online (Sandbox Code Playgroud)
这在找到资源时有效.但是寻找一个不存在的返回500错误.这不应该归还404吗?
> http --json GET chat.dev/api/v1/rooms/23
HTTP/1.1 500 Internal Server Error
Connection: close
Content-Type: text/plain; charset=utf-8
X-Request-Id: 4cd2ba9f-0f85-4530-9c0a-0ef427ac5b31
X-Runtime: 0.094633
ActiveRecord::RecordNotFound at /api/v1/rooms/23
================================================
> Couldn't find Room with id=23
app/controllers/api/v1/rooms_controller.rb, line 20
---------------------------------------------------
``` ruby
15 # render :json => {}, :status => :not_found
16 # end
17 # end
18
19 def show
> 20 render json: Room.find(params[:id])
21 end
22
23 end
24
25 end
Run Code Online (Sandbox Code Playgroud) 我正在运行 Rails-api 的 Rails 4 API 上使用 RSpec 运行集成测试。我想看看如果将错误的电子邮件地址传递给登录控制器,我会得到 401 返回。
这是我的期望
it "should throw invalid login for user with invalid email" do
post "/api/v1/users/sign_in", uname: "wrong_email@wrong.com", password: "12234"
expect(response).to eq(401)
end
Run Code Online (Sandbox Code Playgroud)
在我的控制器中我有:
def create
@user = User.find_by_email(params[:uname])
if(@user && @user.valid_password?(params[:password]))
....
end
Run Code Online (Sandbox Code Playgroud)
这在浏览器中运行良好,我得到了 401 返回。但是当我运行 rspec 时,它只会挂起并且永远不会报告失败或通过,只是坐在那里没有错误。问题的症结似乎是 if(@user) 部分。如果我删除它,那么测试至少会运行。
我检查了 log/test.log,我可以在日志中看到Completed 401 Unauthorized in 14ms (Views: 0.2ms | ActiveRecord: 2.8ms) 。
更新
澄清一下,这是一个request spec. 我正在测试 API 的使用者是否会在电子邮件无效的情况下收到 401 响应。
我在项目(ruby'2.2.0',rails'4.2.3')上工作,它使用标准设计用户管理(用于网页)和devise_token_auth(用于服务的API部分).除非我,一切正常
include DeviseTokenAuth::Concerns::User
Run Code Online (Sandbox Code Playgroud)
在models/user.rb中.然后在用户注册后不发送确认电子邮件.
我很感激这个问题的解决方案.
我的models/user.rb:
class User < ActiveRecord::Base
# Include devise modules.
devise :invitable, :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:confirmable, :omniauthable
include DeviseTokenAuth::Concerns::User
enum role: [:user, :vip, :admin]
after_initialize :set_default_role, :if => :new_record?
def set_default_role
self.role ||= :user
end
end
Run Code Online (Sandbox Code Playgroud)
routes.rb中:
Rails.application.routes.draw do
# standard devise routes available at /users
# NOTE: make sure this comes first!!!
devise_for :users
# token auth routes available at /api/v1/auth
namespace :api do
scope :v1 do
mount_devise_token_auth_for 'User', at: 'auth'
end …Run Code Online (Sandbox Code Playgroud) ruby-on-rails devise access-token devise-confirmable rails-api
我试图从控制器获取 cookie,但puts request.headers['Cookie']我的终端中没有显示任何内容。
我在 chrome 工具中查看详细信息:
请问如何获取cookie?
编辑
我正在编写一个仅 API 的 Rails 5 应用程序,并使用 devise-jwt (和 devise)gem 进行用户身份验证。我正在尝试在我的自定义registrations_controller 中配置强大的参数。在application_controller.rb:
before_action :configure_permitted_parameters, if: :devise_controller?
def configure_permitted_parameters
devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name, :username, :email])
end
Run Code Online (Sandbox Code Playgroud)
并在registrations_controller.rb:
def create
build_resource(sign_up_params)
resource.save
#json response defined in application_controller.rb
render_resource(resource)
end
Run Code Online (Sandbox Code Playgroud)
这是当我通过 Postman 向 API 发出 POST 请求时控制台的输出:
Parameters: {"first_name"=>"john", "last_name"=>"stones", "username"=>"johnstones", "email"=>"john@stones.com"}
params这是打印到控制台的输出:
<ActionController::Parameters {"first_name"=>"john", "last_name"=>"stones", "username"=>"johnstones", "email"=>"john@stones.com", "controller"=>"registrations", "action"=>"create"} permitted: false>
尽管有上述情况,当我这样做时,devise_parameter_sanitizer.sanitize(:sign_up)我得到一个空哈希,并且我前面提到的 POST 抛出了我为空白字段设置的验证错误。请帮我弄清楚我缺少什么,谢谢。
(导轨 5.2/设计 4.2)
我在 Heroku 上部署了 Rails API(Rails API 不是使用 创建的rails new <app-name> --api,而是一个 Rails 应用程序,我从中创建了一个 API)。
在 Heroku 上部署时,Rails API 不起作用并抛出内部服务器错误状态 500。
我尝试使用邮递员和浏览器访问我的 API,但我收到内部服务器错误的 JSON 输出。
上述 JSON 响应是发送请求的结果my-app-name.herokuapp.com/api/v1/foods
我应该提到的是,我尝试heroku run rails console查看我的数据库是否正确播种,并且我获得了我应该正确获得的所有数据。
heroku logs --tail在这里,我复制了尝试向上述网址发送请求后的结果:
2019-06-18T19:45:53.619745+00:00 heroku[web.1]: State changed from starting to up
2019-06-18T19:45:55.010890+00:00 app[web.1]: => Booting Puma
2019-06-18T19:45:55.010918+00:00 app[web.1]: => Rails 5.2.3 application starting in production
2019-06-18T19:45:55.010920+00:00 app[web.1]: => Run `rails server -h` for more startup options
2019-06-18T19:45:55.010922+00:00 app[web.1]: Puma starting in single mode... …Run Code Online (Sandbox Code Playgroud) rails-api ×10
ruby-on-rails ×10
devise ×2
access-token ×1
api ×1
csrf ×1
csrf-token ×1
heroku ×1
rspec ×1
ruby ×1
security ×1