POST API端点内的GET请求会干扰'respond_with'

时间:2013-05-17 16:11:56

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

阅读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 Error并带有Template Missing消息

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

为什么Rails坚持渲染模板,即使我明确告诉respond_with @userRestClient是接管我的回复还是正在发生的事情?

我也尝试在RestClient.get之后提出异常,但输出仍为Template Missing

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我切换到HTTParty宝石,它修复了覆盖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