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

Node.js+GraphQL对接Twilio短信:JSON与XML格式兼容问题求解

解决Twilio Webhook与GraphQL响应格式冲突问题

核心结论

  • Twilio无法处理GraphQL返回的JSON响应,它的Webhook接收端仅识别text/xml格式的TwiML内容,不会解析JSON嵌套的XML字符串,因此必须让接口返回纯XML。
  • 可以通过修改GraphQL resolver的响应逻辑,或单独搭建专用路由的方式,让Twilio收到符合要求的XML响应。

具体解决方案

方案1:在GraphQL Resolver中直接操控响应对象(适配Express+Apollo Server)

通过在Apollo的context中传入请求/响应对象,在resolver里直接修改响应头并发送XML内容,跳过GraphQL默认的JSON包装流程:

  1. 配置Apollo Server时传入req/res到context:
const { ApolloServer } = require('@apollo/server');
const { expressMiddleware } = require('@apollo/server/express4');
const express = require('express');

const app = express();

const server = new ApolloServer({
  typeDefs,
  resolvers,
});

await server.start();

// 将req和res传入context,供resolver调用
app.use('/graphql', express.json(), expressMiddleware(server, {
  context: async ({ req, res }) => ({ req, res }),
}));
  1. 修改对应的resolver:
sms: async (_, __, { res }) => {
  const { MessagingResponse } = require("twilio").twiml;
  const twiml = new MessagingResponse();
  twiml.message("The Robots are coming! Head for the hills!");

  // 设置响应类型为XML并直接发送内容
  res.set('Content-Type', 'text/xml');
  res.send(twiml.toString());

  // 返回null阻止Apollo继续包装JSON响应
  return null;
}

方案2:单独搭建Twilio专用Webhook路由(推荐)

如果不想改动GraphQL的默认响应逻辑,可以保留现有GraphQL接口供内部代码使用,同时新建独立的Express路由专门处理Twilio的Webhook请求,复用生成TwiML的逻辑:

// 可复用的TwiML生成逻辑
const generateTwiMLResponse = () => {
  const { MessagingResponse } = require("twilio").twiml;
  const twiml = new MessagingResponse();
  twiml.message("The Robots are coming! Head for the hills!");
  return twiml.toString();
};

// 原GraphQL resolver(供内部代码调用)
sms: async () => {
  return generateTwiMLResponse();
}

// 新建Twilio专用路由
app.post('/twilio-sms', (req, res) => {
  const twiml = generateTwiMLResponse();
  res.set('Content-Type', 'text/xml');
  res.send(twiml);
});

此时将Twilio的Webhook地址配置为/twilio-sms即可,现有代码库仍正常使用GraphQL接口。

你之前的实现失败原因

你之前的代码通过axios调用原REST接口获取XML,再将XML字符串作为GraphQL字段返回,最终GraphQL会把这个字符串包装成标准JSON结构返回。Twilio收到的是JSON格式响应而非纯XML,因此无法识别并报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 15:30:54