2017-12-12 10 views
0

사용자가 Twilio 번호를 호출 할 때 코드가 XML을 생성하고이를 호출자에게 HTTP 응답으로 보내도록 호출을 자동화하려고합니다. 웹 페이지의 예는 다음과 같습니다.Spark가있는 서버에서 Java 프로그램을 실행하려면 어떻게해야합니까?

@SuppressWarnings("serial") 
@WebServlet("/voice") 
public class IncomingCallServlet extends HttpServlet { 
    // Handle HTTP POST to /voice 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    // Create a TwiML builder object 
    VoiceResponse twiml = new VoiceResponse.Builder() 
     .say(new Say.Builder("Hello world!") 
       .voice(Say.Voice.ALICE) 
       .build()) 
     .build(); 

    // Render TwiML as XML 
    response.setContentType("text/xml"); 

    try { 
     response.getWriter().print(twiml.toXml()); 
    } catch (TwiMLException e) { 
     e.printStackTrace(); 
    } 



    } 
} 

그러나 기본 방법이 없으므로 어떻게 실행합니까? 로컬 포트에서 spark을 사용하여 ngrok를 사용하는 응용 프로그램에 웹 훅을 만듭니다. 내가 메인을 가지고 있다면 작동하지만 여기 예제는 아무 것도주지 않는다.

이 코드를 실행하고 XML을 생성하는 방법에 대한 제안.

답변

2

재미있는 점은 코드에서 Spark에 대한 참조가 보이지 않고 어떤 Java 웹 컨테이너에서든지 실행될 수 있다는 것입니다. 서블릿이 잘 형성된 web.xml에 선언되어 있으면 재미있을 것입니다. 질문과 코드가 올바르게 추출되었다는 것을 이해하면 Spark에 포함 된 Jetty 서버를 사용하여이 서블릿을로드하고자합니다. 당신이 불꽃을 활용하고 명시 적으로 서블릿을 선언하는 번거 로움을 피하려면

, 당신은이 같은 (자바 8을 실행하는 가정)을 작성할 수

import com.twilio.twiml.Say; 
import com.twilio.twiml.VoiceResponse; 

import static spark.Spark.* 

public class IncomingCall { 

    public static void main(String[] args) { 

    // You might want to pass the listen port 
    // e.g as CLI argument or system property 
    port(4567); 
    post("/voice", (request, response) -> { 
     // Create a TwiML builder object 
     VoiceResponse twiml = new VoiceResponse.Builder() 
     .say(new Say.Builder("Hello world!") 
      .voice(Say.Voice.ALICE) 
      .build()) 
     .build(); 

     // Render TwiML as XML 
     response.type("text/xml"); 
     try { 
      return twiml.toXml(); 
     } catch (TwiMLException e) { 
      // This will result in a HTTP 500 
      throw new RuntimeException(e); 
     } 
    } 
    } 
} 
+0

감사합니다. @Mithfindel,이 방법은 web.xml을 수동으로 구성하는 것보다 훨씬 낫습니다. 그러나 doPost() 메소드는 HTTP req/rep를 args로 사용합니다. 수동으로 인스턴스화하지 않고 필요한 메소드를 재정의하지 않고 어떻게 얻을 수 있습니까? – Jerum

+0

SparkJava의 요청 문서 http://sparkjava.com/documentation#request를 참조하십시오. 실제로 Spark은 Java EE API의 "원시"HTTPServlet (요청 | 응답) 객체에 대한 래퍼를 제공합니다. – Mithfindel

+0

또한''Spark.post'' 메소드의 두 번째 인자는 Twilio의 예제에서''doPost'' 메소드 대신에 사용되는 람다입니다. – Mithfindel

1

그것은 SparkApplication 인터페이스를 구현하는 것이 가능하다, web.xml에 필터를 선언하고 documentation에 따라 다른 웹 서버에서 필터를 실행하십시오.