【问题标题】:GET request inside POST API endpoint interferes with 'respond_with'POST API 端点内的 GET 请求会干扰“respond_with”
【发布时间】:2013-05-17 16:11:55
【问题描述】:

在阅读Stored Android Accounts for Authentication of Rails + Devise Accounts 之后,我正在尝试设置一个 Rails 3 API 端点,该端点可以通过对 Google 的 GET 请求验证 OAuth 获得的令牌。

我已将路线配置为:

namespace :api, defaults: {format: :json} do
  namespace :v1 do
    get 'auth/verify' => 'omniauth_verifications#verify_token'
    ...
  end
end

api/v1/omniauth_verifications_controller.rb 中,我将方法定义为:

respond_to :json

def verify_token
  token = params[:token]

  response = RestClient.get("https://www.googleapis.com/oauth2/v2/userinfo", { params: { access_token: token }})

  if response.code == 200
    data = JSON.parse(response.to_s)

    @user = User.find_for_verfied_token_response(data.symbolize_keys)
  end

  respond_with @user
end

问题是,我在到达端点时得到的响应是 500 Internal Server ErrorTemplate Missing 消息

如果我用RestClient.get 注释掉该行,而是使用respond_with User.find(1),则repsonse 为201,并按预期返回json 格式的用户对象。

为什么即使我明确告诉respond_with @user,Rails 仍坚持渲染模板? RestClient 是否接管了我的回复或发生了什么?

我也尝试在RestClient.get 之后引发异常,但输出仍然是Template Missing

【问题讨论】:

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


    【解决方案1】:
    respond_to :json
    
    def verify_token
      token = params[:token]
    
      response = RestClient.get("https://www.googleapis.com/oauth2/v2/userinfo", { params: { access_token: token }})
    
      if response.code == 200
        data = JSON.parse(response.to_s)
    
        @user = User.find_for_verfied_token_response(data.symbolize_keys)
    
        render :json => @user.to_json
      else
        render :json => { }
      end     
    end
    

    【讨论】:

    • 是的,我有,它仍然回复500 - Template Error
    • 我更新了我的代码。虽然我不认为它有效。它解决了响应代码不等于 200 时的问题。
    【解决方案2】:

    我切换到HTTParty gem,它解决了请求覆盖respond_with 的问题。

    我不得不回到 OAuth2 游乐场,发现 Google 现在在请求用户信息时也需要 Authorization 标头。

    这就是我最终的结果:

    def verify_token
      token = params[:token]
    
      response = HTTParty.get("https://www.googleapis.com/oauth2/v2/userinfo", headers: {"Access_token" => token, "Authorization" => "OAuth #{token}"})
    
      if response.code == 200
        data = JSON.parse(response.body)
        @user = User.find_for_verfied_token_response(data.symbolize_keys)
      end
    
      respond_with @user || {}
    end
    

    【讨论】:

      猜你喜欢
      • 2016-06-07
      • 2020-12-01
      • 2012-02-11
      • 2017-05-05
      • 2021-08-28
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 2018-04-04
      相关资源
      最近更新 更多