Dify中需通过HTTP请求节点调用实时API获取天气等动态数据,要求v0.5.0+版本、外网连通,并用代码执行节点解析JSON、注入LLM上下文,配合流式响应实现自然语言播报。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要在Dify中让AI应用真正拿到此刻正在发生的天气、股价、新闻或工单状态,不能依赖模型的“记忆”,必须打通外网API这条数据动脉——否则用户问“今天上海气温多少”,得到的可能是训练截止于2025年12月的虚构数字。
确认Dify版本与网络连通性
进入Dify管理后台 → 点击右下角「关于」→ 查看当前版本号,【必须为v0.5.0或更高版本】,低版本不支持插件化HTTP节点与自定义工具调用。
在服务器终端执行 curl -I https://api.openweathermap.org,若返回 HTTP/2 200 表示外网可达;若超时或拒绝连接,需检查Dify部署环境的出网策略或代理配置。
添加HTTP请求节点并配置实时API
方法一:直连公开API(如和风天气)
在工作流画布中拖入「HTTP请求」节点 → 设置请求方式为GET → 在URL栏填入:https://devapi.qweather.com/v7/weather/now?location={city_id}&key={your_key} → 将city_id和key设为变量,从上游节点传入。
方法二:通过代码执行节点动态拼接(防400错误)
先用「代码执行」节点写JavaScript:const city = $inputs.city_name; const res = await fetch(`https://geoapi.qweather.com/v2/city/lookup?location=${encodeURIComponent(city)}&key=xxx`); return await res.json(); → 提取result.location[0].id作为city_id输出,避免空格、中文导致URL解析失败。
注意:所有API密钥严禁硬编码在URL里,务必使用Dify内置变量或环境变量注入,否则发布后密钥将暴露在前端日志中。
解析API返回的JSON并结构化输出
第一步:确认响应体格式
运行一次测试请求,点击「查看原始响应」,确认返回的是标准JSON(如{“code”:200,“now”:{“temp”:28.5,…}}),而非HTML页面或重定向跳转——后者说明API地址填错或鉴权失败。
第二步:用代码执行节点提取关键字段
在HTTP请求节点后接「代码执行」节点,语言选JavaScript,输入:
const data = $inputs.response;
if (data.code !== '200') throw new Error('天气API调用失败:' + data.code);
const now = data.now;
return { temperature: now.temp + '℃', condition: now.textDay, humidity: now.humidity + '%' };
第三步:验证字段存在性
如果API偶尔返回空now字段(如城市ID无效),直接取now.temp会报undefined错误。必须加if (!now) throw new Error('未获取到实况数据')做兜底,否则整个工作流静默失败。
将实时数据注入LLM上下文生成自然语言回答
把上一步「代码执行」节点的输出,拖入LLM节点的「上下文」区域 → 在系统提示词中写明:“你是一个天气播报助手。用户刚查询了{city}的实时天气,数据如下:温度{temperature},天气状况{condition},湿度{humidity}。请用口语化中文回复,不要复述字段名,不要添加训练数据中的过期信息。”
这一步的关键是切断LLM对自身知识库的依赖。如果不显式传入上下文,模型会默认用内部参数生成答案,哪怕你刚调用完API也视而不见。
启用流式响应并监听data事件
在调用Dify API的客户端侧(如前端React应用),发起请求时必须在headers中加入 Accept: text/event-stream。
服务端返回的每一段内容都以 data: 开头,例如 data: {"answer":"目前上海28℃"} → 客户端需用EventSource或手动读取流,逐行截取 data: 后的内容并JSON.parse(),再追加到界面上。
若漏掉 event: close 判断,连接可能持续挂起,用户看到回答卡在“正在思考…”无法结束。


















