0

我正在尝试将我的 Rails 应用程序与第 3 方 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. 控制器应该将用户的浏览器重定向到一个新的 url

    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
    

但是,似乎因为请求来自 Twilio API 用户代理,所以我无法使用浏览器执行任何操作。因此,虽然在日志中我看到新页面已呈现状态 200 OK,但浏览器没有任何变化。

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

4

2 回答 2

0

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

于 2012-10-23T16:20:01.597 回答
0

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

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

不过,在沿着这条路走下去之前,我会问您是否不能在您的网站上发布某种通知,上面写着“当您完成通话时,请单击此处”。否则,您将不得不将来自 Twilio 的响应存储在数据库(或某处)中,然后让用户的浏览器每隔 x 秒发送一个 ajax 请求以查看响应是否已到达。

于 2012-10-23T16:45:25.603 回答