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

BotFramework多渠道主动消息:请求参数获取问题咨询

刚好看到你的问题,而且你最后已经摸到门道了!我来把整个解决思路理清楚,方便后续参考:

问题背景

你正在开发适配网页/Messenger等多渠道的Bot项目,核心做主动消息功能(比如发送“您已有XXX时间未与我对话”的动态提醒)。目前新增了/api/notify/:conversationID路由,能在模拟器和Messenger正常发消息,但遇到两个参数获取的问题:

  • POST请求下无法正确获取参数
  • 尝试GET请求用/api/notify/CONVID/MESSAGEtoUSER传递参数时,长消息会被识别成路由,返回“方法不存在”
问题原因分析
  1. POST参数获取失败:你用的restify框架默认不会自动解析请求体内容,所以直接访问req.params或者req.body拿不到消息参数。
  2. GET长参数报错:把消息放在URL路径里时,框架会按/分割路径片段,长消息(尤其是包含特殊字符时)会被误判为新的路由节点,导致匹配不到你定义的接口。
解决方案

方案1:POST请求正确解析参数(你已找到的关键方案)

在index.js中启用restify的bodyParser中间件,让框架自动解析POST请求体:

server.use(restify.plugins.bodyParser());

之后修改路由逻辑,从req.body中读取消息内容(路由路径里的conversationID依然从req.params获取):

server.post('/api/notify/:conversationID', async (req, res) => {
  const conversationID = req.params.conversationID;
  const message = req.body.message; // 从请求体读取消息内容

  if (conversationID) {
    console.log('目标对话ID:', conversationID);
  }
  if (message) {
    console.log('要发送的消息:', message);
  }

  // 精准发送给目标对话
  const targetRef = conversationReferences[conversationID];
  if (targetRef) {
    await adapter.continueConversation(targetRef, async turnContext => {
      await turnContext.sendActivity(message);
    });
  } else {
    // 可选:如果找不到目标对话,给所有对话发消息(根据业务需求调整)
    for (let ref of Object.values(conversationReferences)) {
      await adapter.continueConversation(ref, async turnContext => {
        await turnContext.sendActivity(message);
      });
    }
  }

  res.setHeader('Content-Type', 'text/html');
  res.writeHead(200);
  res.write('<html><body><h1>消息发送成功</h1></body></html>');
  res.end();
});

发送请求时,把消息放在JSON请求体里(比如{"message": "您已有3天未与我对话,有问题随时找我哦~"}),既没有长度限制,也能稳定获取参数。

方案2:GET请求的兼容方案(可选)

如果一定要用GET请求,不要把消息放在路径里,改用查询参数传递:

server.get('/api/notify/:conversationID', async (req, res) => {
  const conversationID = req.params.conversationID;
  const message = req.query.message; // 从查询参数读取消息

  // 后续逻辑和POST版本一致...
});

请求URL格式变为/api/notify/xxx?message=您已有XXX时间未与我对话,这样即使消息较长,只要不超过URL长度限制(一般几KB),就不会被误判为路由。不过GET的URL长度限制依然存在,所以更推荐用POST方案。

额外提示
  • 确保conversationReferences对象正确存储了所有对话的引用信息,不然continueConversation会执行失败。
  • 生产环境建议给这个接口加权限校验,避免恶意调用发送垃圾消息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:40:25