0

Rails アプリをサードパーティ API (Twilio) と統合しようとしています。ユーザーはブラウザーのボタンを押して通話を開始し、電話の通話ロジックに従います。通話が終了すると、ブラウザーが別のページにリダイレクトされるようにします。しかし、2 つの異なるユーザー エージェント (ブラウザーと Twilio API) の応答を処理するのに苦労しています。

呼び出しは、次のコントローラー アクションを使用して開始されます (要求がブラウザーから送信されると、render アクションは問題なく動作します)。

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 要求を行います。その意図は、次の 2 つのことが起こることです。

  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

ユーザーがサイトにアクセスすると、サイトはそのユーザーのセッションを作成します。Twilioがリクエストをサイトに直接送信すると、別のセッションが作成されます。これらの2つのセッションは完全に独立しています。そのため、TwilioがサーバーにGETリクエストを送信すると、サーバーはリクエストされたページをレンダリングしてTwilioに送り返すことで応答します。

サーバーはプッシュ更新を送信できません。サーバーは要求を受信して​​応答を送信する必要があります。したがって、自動更新されているように見えるWebサイトは、通常、何らかのjavascriptポーリングを実行しており、ブラウザーはサーバーに定期的な要求(ajax)を送信して、変更があるかどうかを確認します。

ただし、その道を進む前に、「通話が終了したら、ここをクリックしてください」というような通知をサイトに表示できないかどうかを尋ねます。それ以外の場合は、Twilioからの応答をデータベース(またはどこか)に保存してから、ユーザーのブラウザーにx秒ごとにajaxリクエストを送信させて、応答が到着したかどうかを確認する必要があります。

于 2012-10-23T16:45:25.603 に答える
0

sidekiq または resque を使用して、非同期呼び出しを行うことができます。

于 2012-10-23T16:20:01.597 に答える