使用 bash 和 curl 的 ecobee API 恒温器请求 (json)

ecobee API thermostat request (json) using bash and curl

我正在编写一个 bash 脚本来与我的 ecobee 交互(查询信息和更改设置)。我已经完成所有授权(访问令牌和刷新令牌),现在正尝试从 ecobee 请求信息。此 json 参数列表是动态创建的。 None 开发人员 API 文档中的 curl 示例似乎有效。

我试过将 json 分配给一个变量 (?json="$selection") 和一个文件 (?json=@"$location")。我最近的卷曲尝试(硬编码 json 并转义大括号)如下:

response=$(curl -s "https://api.ecobee.com/1/thermostat?json=\{"selection":\{"selectionType":"registered","selectionMatch":null,"includeRuntime":true,"includeSettings":true/}/}" -H "Content-Type: application/json;charset=UTF-8" -H "Authorization: Bearer $access_token")

我收到了一个空响应declare -- response=""

如果我从文件中读取了 curl: {"selection":{"selectionType":"registered","selectionMatch":null,"includeRuntime":true,"includeSettings":true}}

然后我收到:

response='{
  "status": {
    "code": 4,
    "message": "Serialization error. Malformed json. Check your request and parameters are valid."
  }
}'

我认为这是一个逃逸问题?

任何人都可以提供任何见解吗?同样,我认为这将是简单的部分。我正在使用 jq 来构建我的请求 json。 curl 的其他替代方法可以更好地处理 json?我仅限于 bash(这是我所知道的)

谢谢

要将(任意)数据集成到 URL(或一般的 URI)中,您需要先使用 percent-encoding 进行准备。

正如您提到的使用 jq 来组合数据,您可以将 @uri 添加到您的 jq 过滤器来执行编码,并使用 --raw-output(或 -r) 选项,然后正确输出它。

例如,jq -r '@uri' 应用于您的 JSON

{
  "selection": {
    "selectionType": "registered",
    "selectionMatch": null,
    "includeRuntime": true,
    "includeSettings": true
  }
}

output

%7B%22selection%22%3A%7B%22selectionType%22%3A%22registered%22%2C%22selectionMatch%22%3Anull%2C%22includeRuntime%22%3Atrue%2C%22includeSettings%22%3Atrue%7D%7D

您可以在 query string ?json=….

中使用