跳到主要内容

接口操作-从上下文获取响应数据

使用由另一个流程设置的数据来响应 HTTP 请求

接口路由访问规则参考 接口操作-创建接口

问题背景

使用由另一个流程设置的数据来响应 HTTP 请求

解决方案

使用 流程上下文 (flow context) 来存储数据,以便可以在 HTTP 流程中获取。通常我们可以使用 flow.xxx 来设置当前流的全局变量,在当前流中可以使用 flow.xxx 来获取。

比如我们使用 调整消息属性 设置一个全局变量 flow.myData = "hello world"

change-flow-context

在当前流程中的其他节点中,我们可以直接获取 flow.myData 中存储的数据,比如在另一个 调整消息属性 节点获取 flow.myData 中的数据

change-flow-context-copy

如果是使用 函数 节点 ,我们可以直接使用 flow.get('myData') 来获取数据。

function-flow-context-get-set

示例

如何在一个流程中存储数据,并在另一个处理 HTTP 请求的流程中检索和使用它。

先点击注入按钮,将当前时间戳通过 调整消息属性 节点复制给 flow.timestamp,再访问当前接口获取响应数据

http-in-context

数据存储流程(上方流程):

  • 注入 节点: 配置为每当触发时,将当前时间戳注入到 msg.payload 中。
  • 调整消息属性 节点 : 将 msg.payload 中的时间戳值存储到流程上下文变量 timestamp 中。 HTTP 响应流程(下方流程):
  • 接口定义 节点: 监听 GET 请求到 /prod-api/noco-instance/stotest/public/hello-data。
  • 调整消息属性 节点: 从流程上下文变量 timestamp 中检索存储的时间戳,并将其设置到当前消息的 msg.timestamp 属性中。
  • 模板转化 节点: 使用 Mustache 语法生成 HTML 响应。它通过 {{timestamp}} 访问 msg.timestamp 的值。
  • 接口响应 节点: 将 模板转化 节点生成的 HTML 作为响应发送回客户端。

这种方法允许不同的流程(或同一流程中的不同部分)共享数据,而无需直接连接。

示例JSON

[{"id":"92eaf6c0.6d1508","type":"inject","z":"65b5dbf44a0ca401","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":"","topic":"","payload":"","payloadType":"date","x":150,"y":1320,"wires":[["8055b557.7faa48"]]},{"id":"8055b557.7faa48","type":"change","z":"65b5dbf44a0ca401","name":"将注入时间戳保存到 flow.timestamp ","rules":[{"t":"set","p":"timestamp","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":390,"y":1320,"wires":[[]]},{"id":"93bf2335.6c40e","type":"http in","z":"65b5dbf44a0ca401","name":"","url":"/hello-data","method":"get","upload":false,"swaggerDoc":"","advancedoptions":false,"apiAuth":"public","x":160,"y":1400,"wires":[["9e3aa25e.61c56"]]},{"id":"9e3aa25e.61c56","type":"change","z":"65b5dbf44a0ca401","name":"将 flow.timestamp 复制给 msg.payload","rules":[{"t":"set","p":"timestamp","pt":"msg","to":"timestamp","tot":"flow"}],"action":"","property":"","from":"","to":"","reg":false,"x":450,"y":1400,"wires":[["f2c385a.f0d3c78"]]},{"id":"f2c385a.f0d3c78","type":"template","z":"65b5dbf44a0ca401","name":"page","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"<html>\n    <head></head>\n    <body>\n        <h1>Time: {{ timestamp }}</h1>\n    </body>\n</html>","x":690,"y":1400,"wires":[["935d498321053527"]]},{"id":"935d498321053527","type":"http response","z":"65b5dbf44a0ca401","name":"接口响应","statusCode":"","headers":{},"commonTemplate":false,"responseCode":0,"responseCodeType":"num","responseData":"payload","responseDataType":"msg","responseMsg":"success","responseMsgType":"str","x":840,"y":1400,"wires":[]}]

运行结果

在浏览器访问接口: https://192.168.108.251:8080/prod-api/noco-instance/stotest/public/hello-data

http-in-context-result

可以在每次访问接口前点击一次注入时间戳,可以看到返回的数据会跟着变化,如果点击注入按钮更新flow.timestamp ,那每次返回的都是同一个值