使用Airflow Web API创建JSON类型变量报错400的问题排查
Airflow API创建JSON格式变量失败的解决办法
Airflow Variables REST API要求value字段必须是字符串类型,你直接传入JSON对象会触发类型校验失败,这就是返回400错误的原因。Airflow支持存储JSON格式的变量内容,但需要先把JSON对象序列化为字符串再传入。
修正后的curl脚本
方式1:手动转义JSON为字符串
把value里的JSON对象转成转义后的字符串:
curl -X POST "${AIRFLOW_URL}/api/v1/variables" \ -H "Content-Type: application/json" \ --user "${AIRFLOW_USERNAME}:${AIRFLOW_PASSWORD}" \ -d '{"key": "my_json_var", "value": "{\"key1\":\"val1\",\"key2\":\"123\"}"}'
方式2:用jq自动处理(避免手动转义)
如果系统安装了jq,可以用它来自动序列化JSON,更简洁不易出错:
curl -X POST "${AIRFLOW_URL}/api/v1/variables" \ -H "Content-Type: application/json" \ --user "${AIRFLOW_USERNAME}:${AIRFLOW_PASSWORD}" \ -d "$(jq -n --argjson value '{"key1":"val1","key2":"123"}' '{key: "my_json_var", value: ($value | tostring)}')"
修正后的Python requests代码
用json.dumps()把字典序列化为字符串后传入:
import requests import json airflow_url = "你的Airflow地址" auth = ("用户名", "密码") payload = { "key": "my_json_var", "value": json.dumps({"key1": "val1", "key2": "123"}) } response = requests.post( f"{airflow_url}/api/v1/variables", json=payload, auth=auth ) print(response.status_code) print(response.json())
当你需要读取这个变量时,Airflow会自动把字符串反序列化为JSON对象(比如在DAG中用Variable.get("my_json_var", deserialize_json=True))。
内容的提问来源于stack exchange,提问作者Viktorov Ivan
相关产品推荐
相关产品推荐

