2013-08-25 2 views
0

즉시 전화를 끊은 다음 Twilio 번호로 전화를 걸어 다시 전화하겠습니다. 이것은 이전 질문과 유사합니다 (동일하지는 않습니다).twilio, sinatra ruby ​​강제 종료 및 콜백

문제는 Twilio를 강제 종료 할 때 발생합니다.

루비 코드는 다음과 같습니다

get '/callback' do 
    to = params['From'] 
    from = 'my Twilio number' 
    "<Response><Hangup/></Response>" 
    sleep 5 
    # set up a client to talk to the Twilio REST API 
    @client = Twilio::REST::Client.new account_sid, auth_token 
    @call = @client.account.calls.create(
    :from => from, # From your Twilio number 
    :to => to, # To any number 
    # Fetch instructions from this URL when the call connects 
    :url => 'https://dl.dropboxusercontent.com/u/85088004/twilio/twilio.xml' 
    ) 
end 

이 메시지를 생성합니다 "죄송하지만 시스템 오류가 발생했습니다." 문제는 전화 끊기 명령에 있습니다. I는 상기 시도도

<Response><Hangup/></Response> #without enclosing double or single quotes 

Twilio::TwiML::Response.new do |r| 
r.Hangup 
end.text 

어느 것도 끊기 원하는 결과를 생성한다.

무엇이 잘못 되었나요?

미리 감사드립니다.

답변

0

@ Kevin의 조언과 함께 Twilio 지원 센터에 문의하십시오. 그러나 내가 덧붙이고 싶은 한가지 의견. /callback 액션이 끝날 때 마지막 값은 호출을 할 때 지정하는 변수 @call입니다. Ruby는 HTTP 요청의 결과로이 값을 반환하려고합니다.

루비는 메서드의 끝에서 평가 된 마지막 값을 반환합니다. 이 경우 Sinatra가 HTTP Get 요청에 기본적으로 응답하는 값입니다.

<Response><Hangup/></Response> 문자가있는 문자열로 판단하면보기를 사용하지 않고 추측 요청의 결과가 될 것으로 예상합니다. 다음과 같이 메소드의 맨 마지막에 배치해야합니다. 또한 응답 헤더를 설정하여 응답이 XML이라고 말하는 content_type을 추가했습니다.

get '/callback' do 
    to = params['From'] 
    from = 'my Twilio number' 
    # set up a client to talk to the Twilio REST API 
    @client = Twilio::REST::Client.new account_sid, auth_token 
    @call = @client.account.calls.create(
     :from => from, # From your Twilio number 
     :to => to, # To any number 
     # Fetch instructions from this URL when the call connects 
     :url => 'https://dl.dropboxusercontent.com/u/85088004/twilio/twilio.xml') 
    #ruby returns the last value in a method: 
    content_type 'text/xml' 
    "<Response><Hangup/></Response>" 
end 

Twilio 음성 콜백이 요청 가져 오기로 설정되어 있는지 확인하십시오 (기본값은 게시물 임).

내가 가지고있는 sleep 5도 삭제했습니다. 당신이 어디로 가는지 볼 수 있습니다. hangup TwiML로 응답하고 몇 초 후에 다시 전화를 겁니다. 슬프게도, Sinatra는 그렇게 잘 작동하지 않습니다. 메서드가 끝날 때까지 HTTP 요청에 응답하지 않습니다. 그래서 당신은 그냥 앉아서 아무 이유없이 5 초 동안 기다릴 것입니다.

Twilio가 전화를 끊으려는 전화 번호로 전화를 걸면 약간의 문제가 발생하므로 기본적으로 경쟁 조건이 있습니다. 먼저 통화가 끊어 지거나 아웃 바운드가 통화중인 번호로 울립니 다.

이렇게하는 방법에는 여러 가지가 있지만 스레드를 제안합니다. 조금 까다 롭지 만,이 SO answer은 자세히 설명합니다.

+0

대단히 감사합니다. 나는 당신의 사려 깊은 대답에 감사드립니다. 나는 그것을 한 번 줄 것이고 당신에게 알려줄 것이다. 나는 Twilio URL을 "get"으로 설정해야 할 필요성을 알았지 만, 그것은 잠재적으로 진짜 "잡았다"지만 그것을 지적 해 주셔서 감사합니다. 케빈, 고마워! – user1903663

+0

xmjw, 고맙습니다. 이전에 전화가 걸려 온 후에 전화 끊기 XML이 표시된다는 사실에 머리를 맞출 수 없습니다! 왜 이런거야? – user1903663

+0

동시성이 부족하기 때문입니다. 당신은 HTTP GET 요청을 받고, Twilio의 REST API에 또 다른 HTTP 호출을 한 다음, 원래의 GET 요청에 대한 응답 스트림에 TwiML을 다시 쓰는 단일 스레드를 가지고있다. 그래서 Twilio의 REST API로부터 아웃 바운드 콜이 시작되었다는 응답이있을 때까지 응답 데이터를 쓰지 않습니다. 모든 것이 순차적으로 일어나고 있습니다. – xmjw

0

twilio.com/user/account/debugger에서 Twilio 디버거를 확인하십시오. 그러면 실패에 대한 자세한 정보가 제공됩니다.

+0

감사합니다. 정보를 솔루션과 관련시킬 수 없습니다. 나는 여기에 디버그를 게시 할 것이다. 보기에서 코드가 정확합니까? – user1903663

+0

말하기 어렵습니다. 디버거에서 서버에 연결할 수 없다고보고합니까? TwiML이 유효하지 않다고보고합니까? –

+0

감사합니다. "문서 구문 분석 실패"또는 "http 검색 오류"입니다. 문제가 전화 끊기를 강요하고 있지만 올바른 코드가 무엇인지 확신 할 수 없습니다. – user1903663