【问题标题】:Rails: External API Integration using RestClient (400 Bad Request)Rails:使用 RestClient 的外部 API 集成(400 错误请求)
【发布时间】:2019-12-28 03:22:15
【问题描述】:

我正在建立一个数字图书馆,并且我已经完成了很多需要的功能。我目前在将数字图书馆与学习管理系统 (LMS) 集成时遇到问题。

我已经有一个使用 Devise gem 的数字图书馆管理员身份验证系统。我的目标是允许想要访问数字图书馆的用户使用他们的学习管理系统 (LMS) 凭据(用户名和密码)登录数字图书馆。

我已经获得了学习管理系统 (LMS) 的登录 API 端点和其他所需参数,并且我创建了 用户模型会话控制器会话视图模板

我目前正在使用 RestClient Gem 进行 API 调用,但遇到错误 400 Bad Request。我试图调试这个问题,它让我指向 Sessions Controller

中的这一行
 response = RestClient::Request.execute(

下面是我的源码

会话控制器

require 'rest-client'

class SessionsController < ApplicationController
  def new
  end

  def create
    response = RestClient::Request.execute(
      method: :post,
      url: 'https://newapi.example.com/token',
      payload: { 'username': 'params[:username]',
                 'password': 'params[:password]',
                 'grant_type':'password' },
      headers: { apiCode: '93de0db8-333b-4f478-aa92-2b43cdb7aa9f' }
    )

    case response.code
    when 400
      flash.now[:alert] = 'Email or password is invalid'
      render 'new'
    when 200
      session[:user_id] = user.id
      redirect_to root_url, notice: 'Logged in!'
    else
      raise "Invalid response #{response.to_str} received."
    end
  end

  def destroy
    session[:user_id] = nil
    redirect_to root_url, notice: 'Logged out!'
  end
end

会话新视图

<p id=”alert”><%= alert %></p>
<h1>Login</h1>
<%= form_tag sessions_path do %>
  <div class="field">
    <%= label_tag :username %>
    <%= text_field_tag :username %>
  </div>
  <div class="field">
    <%= label_tag :password %>
    <%= password_field_tag :password %>
  </div>
  <div class="actions">
    <%= submit_tag 'Login' %>
  </div>
<% end %>

用户模型

class User < ApplicationRecord
  has_secure_password

  validates :username, presence: true, uniqueness: true
end

我们将不胜感激任何形式的代码示例帮助。如果需要,我也愿意提供有关此集成的更多信息。提前谢谢你。

【问题讨论】:

    标签: ruby-on-rails api rest-client


    【解决方案1】:

    您应该删除参数周围的引号:

     response = RestClient::Request.execute(
          method: :post,
          url: 'https://newapi.example.com/token',
          payload: { 'username': params[:username],
                     'password': params[:password],
                     'grant_type':'password' },
          headers: { apiCode: '93de0db8-333b-4f478-aa92-2b43cdb7aa9f' }
        )
    

    如果您有引号,则意味着您的 username 值和 password 值是硬编码的。在这里您要从参数中检索 usernamepassword

    【讨论】:

    • 非常感谢您的帮助。我遇到了另一个问题#SessionsController 的未定义局部变量或方法“用户”。请在这里链接到问题stackoverflow.com/q/57615870/10907864。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 2022-01-04
    • 1970-01-01
    • 2013-11-29
    • 2020-11-13
    • 2011-06-18
    • 2017-02-13
    相关资源
    最近更新 更多