我正在尝试自动调用呼叫,以便当用户调用Twilio号码时,代码将生成XML并将其作为HTTP响应发送给调用者。他们网页上的例子是:
@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。它有效,如果我有一个main,但这里的例子没有给出任何。
有关如何运行此代码以及生成XML的任何建议。
答案 0 :(得分:2)
有趣的是,我在代码中看不到Spark的任何引用,它可以在任何Java Web容器上运行,前提是您在格式良好的web.xml
中声明了servlet。如果我理解你的问题和代码正确提取,你似乎愿意依赖嵌入Spark的Jetty服务器来加载这个servlet。
如果你想利用Spark并避免明确声明你的servlet的麻烦,你可以写这样的东西(假设你正在运行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);
}
}
}
}
答案 1 :(得分:1)
可以实现SparkApplication接口,在web.xml中声明一个过滤器,然后根据documentation在另一个Web服务器中运行它。