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

Twilio SMS Webhook接入Sinatra遇ISE 500及JSON解析错误求助

解决Twilio Webhook的JSON解析错误与Content-Type问题

核心原因

Twilio默认不会向Webhook发送JSON格式数据,而是发送application/x-www-form-urlencoded的表单编码数据(就是你看到的ApiVersion=2010-04-01&SmsSid...这种格式)。你用JSON.parse解析表单数据,自然会触发JSON::ParserError;而Content-Type显示为text/html大概率是Sinatra默认的响应类型,或是你混淆了请求与响应的Content-Type。

解决方案

1. 适配Twilio默认的表单数据格式(推荐)

直接用Sinatra内置的params对象获取Twilio传递的所有数据,无需手动解析请求体:

post '/your-webhook-endpoint' do
  # 直接获取Twilio的表单数据
  twilio_payload = params
  log_twilio(twilio_payload.to_s)

  # 必须返回Twilio要求的TwiML(XML),否则会触发异常
  content_type 'application/xml'
  "<Response><Message>消息已收到</Message></Response>"
end

2. 配置Twilio发送JSON格式请求(如果需要)

如果确实需要Twilio发送JSON,需在Twilio控制台修改Webhook设置:

  • 进入对应的SMS服务配置页面
  • 找到Webhook的"Content Type"选项,选择"JSON"
  • 保存后,Twilio会以application/json格式发送请求,此时你的原代码可正常工作,但仍需注意返回正确的响应格式:
post '/your-webhook-endpoint' do
  json_payload = JSON.parse(request.body.read)
  log_twilio(json_payload.to_s)

  # 返回JSON或TwiML,根据Twilio要求调整
  content_type 'application/json'
  { status: "success" }.to_json
end

排查步骤

  • 确认请求的Content-Type:在路由中添加日志记录request.content_type,明确Twilio实际发送的请求类型,区分是请求还是响应的Content-Type问题。
  • 模拟请求测试:用Postman发送application/x-www-form-urlencoded或application/json格式的POST请求到你的Webhook,验证代码是否正常工作。
  • 检查Twilio日志:在Twilio控制台的"Logs"页面查看Webhook请求的详细信息,确认Twilio发送的请求格式、状态码及响应内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:01:23