You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tomcat中Twilio来电Servlet报错:HTTP GET方法不被支持

问题分析与解决方案

核心问题

你遇到的两个关键问题:

  1. HTTP GET请求不被支持:你的Servlet仅实现了doPost方法,当收到GET请求(比如浏览器直接访问测试)时,默认的HttpServlet会返回405错误。
  2. URL映射冲突+注解不生效:你同时使用了@WebServlet("/voice")注解和web.xml中的/IncomingCallServlet映射,但你的web.xml基于Servlet 2.3规范(不支持注解),导致注解完全无效,实际生效的只有web.xml中的映射路径。

解决方案

1. 统一Servlet映射方式(推荐保留web.xml映射)

由于你的web.xml使用Servlet 2.3 DTD,注解无法生效,直接去掉代码中的注解,确保web.xml的映射是唯一入口:

修改后的Servlet代码:

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

@SuppressWarnings("serial")
// 移除@WebServlet("/voice")注解
public class IncomingCallServlet extends HttpServlet {
  // 处理Twilio发送的POST请求
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    VoiceResponse twiml = new VoiceResponse.Builder()
        .say(new Say.Builder("Hello world!")
              .voice(Say.Voice.ALICE)
              .build())
        .build();

    response.setContentType("text/xml");
    try {
      response.getWriter().print(twiml.toXml());
    } catch (TwiMLException e) {
      e.printStackTrace();
    }
  }

  // 新增doGet方法,用于浏览器测试或兼容GET请求
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    // 复用doPost逻辑,避免GET请求返回405错误
    doPost(request, response);
  }
}

2. 验证Twilio Webhook配置

确保Twilio控制台中设置的来电Webhook URL是:
http://你的公网地址:端口/项目名称/IncomingCallServlet
(本地测试需用ngrok等工具暴露Tomcat端口,生成公网访问地址)

3. 可选:升级到Servlet 3.0+使用注解

如果想改用注解映射,需要修改web.xml的根声明为Servlet 3.0规范:

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
         version="3.0">
  <display-name>Archetype Created Web Application</display-name>
  <!-- 保留TestServlet的映射,删除IncomingCallServlet的<servlet>和<servlet-mapping>节点 -->
  <servlet>
    <servlet-name>TestServlet</servlet-name>
    <display-name>TestServlet</display-name>
    <servlet-class>neelr.TestServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <url-pattern>/TestServlet</url-pattern>
  </servlet-mapping>
</web-app>

然后恢复Servlet中的@WebServlet("/voice")注解,Twilio的Webhook URL对应改为http://公网地址:端口/项目名称/voice。


额外检查项

  • 确认Tomcat启动日志无报错,项目已成功部署
  • 检查Twilio控制台的调试日志,查看请求的返回状态码和错误详情
  • 确保本地端口未被防火墙拦截,公网工具(如ngrok)运行正常

内容的提问来源于stack exchange,提问作者Neel Raina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 15:01:20