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
相关产品推荐
相关产品推荐

