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を使ってアプリケーションにWebhookを作成します。私はメインを持っていれば動作しますが、ここの例は何も与えません。

このコードを実行してXMLを生成する方法についての提案。

答えて

2

面白いことに、あなたのコードにSparkへの参照がなく、どんなJava Webコンテナでも実行できるということです。サーブレットがwell形式で宣言されている場合はweb.xmlです。あなたの質問とコードの抽出が正しく理解されていれば、このサーブレットをロードするためにSparkに組み込まれたJettyサーバーに頼っているようです。

あなたがスパークを活用して、明示的にサーブレットを宣言するの面倒を避けたい場合、あなたは(あなたは、Java 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(Request | Response)オブジェクトのラッパーを提供しています。 – Mithfindel

+0

また、 '' Spark.post''メソッドの第2引数はTwilioの例の '' doPost''メソッドに代わるラムダです。 – Mithfindel

1

それはSparkApplicationインターフェイスを実装することは可能ですが、 web.xmlにフィルタを宣言し、documentationに従って別のWebサーバでフィルタを実行します。

関連する問題