我正在尝试将我的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请求。目的是要发生两件事:
控制器应将用户的浏览器重定向到 新网址
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?
答案 0 :(得分:0)
您可以使用sidekiq或resque进行异步调用。
答案 1 :(得分:0)
当用户访问您的网站时,您的网站会为该用户创建会话。当Twilio直接向您的站点发送请求时,会创建一个单独的会话。这两个会议是完全独立的。因此,当Twilio向您的服务器发送GET请求时,您的服务器会通过呈现所请求的页面并将其发送回Twilio 来响应。
您的服务器无法发送推送更新,它必须接收请求并发送响应。因此,您看到的任何看似自动更新的网站通常会进行某种javascript轮询,浏览器会向服务器发送定期请求(ajax)以检查是否有任何更改。
在沿着这条路走下去之前,我会问你是否不能在你的网站上发出一些声明“当你完成通话时,请点击这里”。否则,您必须将来自Twilio的响应存储在db(或某处)中,然后让用户的浏览器在x秒内发送ajax请求以查看响应是否已到达。