如何根据第三方API的请求重定向rails应用程序中的浏览器

时间:2012-10-23 16:04:27

标签: ruby-on-rails ruby-on-rails-3.2 twilio

我正在尝试将我的Rails应用程序与第三方API(Twilio)集成。用户通过按下浏览器上的按钮发起呼叫,他们按照电话上的呼叫逻辑,然后当呼叫终止时,我希望浏览器被重定向到不同的页面。 但是,我很难处理两个不同用户代理(浏览器和Twilio API)的响应。

使用以下控制器操作启动调用(并且当请求来自浏览器时,渲染操作可以正常运行):

def set_up
@client = Twilio::REST::Client.new ACCOUNT_SID, AUTH_TOKEN
data = {
  from:   FROM,
  to:   params[:number],
  url:  candidate_begin_url(@candidate),
  method: 'get',
  timeout: 10
}
@client.account.calls.create data
render 'candidates/interview_in_progress'
end

在通话结束时,一旦用户准备好终止,Twilio API会向以下控制器发出GET请求。目的是要发生两件事:

  1. 控制器应该使用XML指令响应Twilio API 挂断电话
  2. 控制器应将用户的浏览器重定向到 新网址

    def finalize_call      
     response = Twilio::TwiML::Response.new do |r|
      r.Hangup
     end.text
     respond_to do |format|
      format.html { redirect_to candidate_complete_voice_interview_path(@candidate) }
      format.xml {  render xml: response }
     end
    end
    
  3. 然而,似乎因为请求来自Twilio API用户代理,我无法使用浏览器执行任何操作。所以在日志中我看到新页面已经呈现状态200 OK,浏览器没有变化。

    我的问题是,我如何指示浏览器根据来自其他用户代理的请求重定向,在这种情况下是API?

2 个答案:

答案 0 :(得分:0)

您可以使用sidekiq或resque进行异步调用。

答案 1 :(得分:0)

当用户访问您的网站时,您的网站会为该用户创建会话。当Twilio直接向您的站点发送请求时,会创建一个单独的会话。这两个会议是完全独立的。因此,当Twilio向您的服务器发送GET请求时,您的服务器会通过呈现所请求的页面并将其发送回Twilio 来响应。

您的服务器无法发送推送更新,它必须接收请求并发送响应。因此,您看到的任何看似自动更新的网站通常会进行某种javascript轮询,浏览器会向服务器发送定期请求(ajax)以检查是否有任何更改。

在沿着这条路走下去之前,我会问你是否不能在你的网站上发出一些声明“当你完成通话时,请点击这里”。否则,您必须将来自Twilio的响应存储在db(或某处)中,然后让用户的浏览器在x秒内发送ajax请求以查看响应是否已到达。