使用参数化的 Flux 查询
InfluxDB Cloud 支持 参数化的 Flux 查询,允许您使用 InfluxDB API 动态改变查询中的值。参数化查询使 Flux 查询更加可重用,也可以帮助防止注入攻击。
防止注入攻击
在执行包含不可信用户输入的Flux查询时,请使用参数化查询;例如,在Web或物联网应用程序中。有关安全性和查询参数化的更多信息,请参阅OWASP SQL Injection Prevention Cheat Sheet。虽然本指南是关于SQL的,但它包含有用的一般建议。
InfluxDB Cloud /api/v2/query API 端点 接受请求体中的 params 字段。 params 字段是一个 JSON 对象,包含键值对,键是参数名称,值是参数值。 例如:
"params": {
"ex1": "foo",
"ex2": "bar"
}
InfluxDB Cloud 将 params JSON 对象插入到 Flux 查询中,作为一个名为 params 的 Flux 记录。使用 点或括号表示法 访问 Flux 查询中 params 记录中的参数。例如,使用上面的示例 params JSON,以下查询
from(bucket: params.ex1)
|> range(start: -1h)
|> filter(fn: (r) => r._measurement == params.ex2)
将会执行为
from(bucket: "foo")
|> range(start: -1h)
|> filter(fn: (r) => r._measurement == "bar")
示例
要使用参数化查询,请执行以下操作:
创建你的Flux查询。使用 点或括号表示法 来引用
params记录中的参数,以在查询时填充值。以下示例使用params.mybucket来定义桶名称。from(bucket: params.mybucket) |> range(start: -7d) |> limit(n:2)使用 InfluxDB Cloud
/api/v2/queryAPI 终端来执行您的查询。 在请求体中提供以下内容:- query: 要执行的原始 Flux 查询
- 参数: 包含查询中每个参数的键值对的JSON对象。
例如:
curl --request POST \ 'https://cloud2.influxdata.com/api/v2/query?orgID=<YourOrgID>' \ --header 'authorization: Token <YourAuthToken>' \ --header 'content-type: application/json' \ --data '{ "query":"from(bucket: params.mybucket) |> range(start: -7d) |> limit(n:2)", "params":{ "mybucket":"telegraf" } }'
支持的参数数据类型
带参数的Flux查询支持 int、 float 和 string 数据类型。要将支持的数据类型转换为其他 Flux基本数据类型,请使用 Flux类型转换函数。
例如,要使用参数化的持续时间值定义 range() 函数的 start 参数:
使用
duration()函数将param值转换为持续时间:from(bucket:"example-bucket") |> range(start: duration(v: params.mystart)) |> limit(n:2)在您的查询请求主体的
param字段中,将持续时间参数格式化为字符串:{ "query": "from(bucket:\"example-bucket\") |> range(start: duration(v : params.mystart)) |> limit(n:2)", "params": { "mystart": "-7d" } }