物联网中的 Node-RED(5):HTTP 节点(REST 接口与 Webhook)

物联网中的 Node-RED(5):HTTP 节点(REST 接口与 Webhook)

Node-RED 里"对外喊话、对外露接口"就靠 HTTP 那一组节点。你的双服务端推送、AI 摄像头报警回调,本质都是 HTTP 节点在干活。

一、是什么

HTTP 相关节点有两类,别混:

  • http request(请求端):主动调别人的 REST API,相当于代码里的 HttpClient。配置好 method(GET/POST…)、URL、返回格式(JSON / 字符串 / 二进制),上游 msg 的 payload 或 url/headers 会驱动它。
  • http in + http response(服务端正):在 Node-RED 本地起一个 HTTP 服务,监听某个路径和方法(如 POST /webhook/alarm),收到请求后经 function 处理,再用 http response 把结果写回去。没有 http response,请求方会一直挂着超时。

一句话:request = 去调别人;in/response = 让别人来调你(Webhook 接收端)。

二、怎么用

调外部接口(双服务端推送的核心)

  1. 拖 http request,Method 选 POST,URL 填你的第一个服务端地址。
  2. 上游 function 把设备数据组装成 msg.payload = { deviceId, ts, value }。
  3. Return 选 a parsed JSON object,方便后面判断返回码。
  4. 收到后接 switch 看 msg.statusCode === 200 才认为成功,失败走重发/告警。
  5. 第二个服务端同理再接一条流(星球的"双服务端推送"就这么来的)。

露本地接口(接收 AI 摄像头报警)

  1. 拖 http in,Method=POST,URL=/alarm/camera。
  2. 后面接 function 解析 msg.payload(摄像头 POST 来的 JSON:报警类型、置信度、图片 URL)。
  3. 处理完拖 http response,Status Code 填 200,Body 随便回个 {"ok":true}。
  4. 务必加 catch,否则摄像头重试会把流卡死。

三、用在哪里

  • 双服务端推送:Node-RED 把同一份设备数据 POST 到你的两个服务端,互为备份。
  • AI 摄像头报警回调:摄像头识别到滑坡/入侵 → POST 给 Node-RED 的 http in → 解析 → 转 MQTT/再推平台。
  • 调用第三方开放 API:天气、地图、短信网关,用 http request 拉数据进流。
  • 给前端/大屏供数据:http in 暴露一个 GET /latest 返回最新测点,前端轮询或转发。

四、怎么能用好(避坑)

  • 设超时 + 重试:http request 有 Timeout 参数(秒),公网别用默认 0(一直等)。失败用 delay+loop 或 function 计数器做有限次重试,别无限重发。
  • 先判状态码:别拿到 payload 就当成功,msg.statusCode 非 2xx 要分流处理。
  • Body 解析要对:摄像头 POST 来的可能是 application/json(直接是对象),也可能是 form 或原始字符串,function 里先 typeof msg.payload 再处理。
  • HTTPS 证书:调公网 API 记得开 TLS;内网自签证书可能要关校验(仅内网可接受)。
  • 鉴权头:服务端要 token,就在 http request 的 Headers 里加 Authorization: Bearer xxx,别写进 URL。
  • http in 端口别撞:默认 1880 是编辑器,自己起的接口换端口或加路径前缀,避免和别的进程抢。
  • Webhook 必须鉴权:暴露 /alarm 这种接口,至少校验来源 IP 或签名,别裸奔。

五、原理

  • http request 底层是 Node.js 的 http/https 模块,msg.url/msg.payload/msg.headers 覆盖节点配置;返回写入 msg.payload,状态码在 msg.statusCode。
  • http in 基于 Node-RED 内置的 Express 路由,按 URL + Method 注册端点;收到请求把 body 放进 msg.payload、msg.req/msg.res 持有原生对象,http response 最终调用 res.send() 结束这次请求。
  • 因为是事件驱动,请求进来就走流,不阻塞别的节点——这也是它能扛并发回调的原因。

六、背景:它从哪里来

HTTP 是 1989–1991 年 Tim Berners-Lee 在 CERN 发明的(详见系列二第10篇),Node-RED 把它封装成可视化节点(基于 Express + Node http 客户端)。在 IoT 里,HTTP 天生适合"低频管理、事件回调、跨网穿透"——你的双服务端推送和摄像头报警正是这种场景,高频采集还是交给 MQTT/CoAP(系列二第09、11篇)。

误区澄清

  • "HTTP 节点 = 完整 Web 服务器":错。它只露你配的几个路由,没有静态托管、没有完整中间件栈,别拿它当 Nginx。
  • "调通一次就稳了":错。公网会超时、服务端会重启、token 会过期,必须加超时/重试/状态码判断。
  • "Webhook 不用鉴权,内网没事":错。很多摄像头/平台回调能被伪造,至少校验来源或签名。
  • "POST 来的 payload 一定是 JSON 对象":错。可能是字符串或表单,不判类型直接 .field 会报错把流打挂。
posted @ 2026-09-24 20:41  星辰手  阅读(7)  评论(0)    收藏  举报