curl --request POST \
--url 'https://bankofloyal.atlassian.net/rest/api/2/issue' \
--user [email protected]:$JIRA_TOKEN \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{
"fields": {
"project": {
"key": "'$JIRA_PROJECT'"
},
"parent": {
"key": "'$PARENT_ISSUE_KEY'"
},
"components": [
{
"id": "'$COMPONENT_ID'"
}
],
"summary": "Directories with migration changes: '"${DIR_JOINED}"'",
"description": "Name of models: '"${MODEL_NAMES}"'",
"issuetype": {
"name": "Sub-task"
}
}
}'
我想要一张使用 cURL 生成的票证,但收到“JSON 解析错误”。在调试时,我发现问题出在正文的摘要和描述中,错误地使用了变量DIR_CHANGED
和MODEL_NAME
。你能建议一些其他方法吗?
由于不知道 shell 变量的实际内容,我假设至少有一个包含换行符、制表符、双引号或可能需要在 JSON 文档中编码的其他字符。一般来说,避免将 shell 字符串注入 JSON。用于
jq
从 shell 变量创建有效的 JSON。这确保了字符串被正确编码。在下面的脚本片段中,我假设使用的五个 shell 变量
jq
已经设置为其预期值。然后,该脚本通过提供 shell 变量来创建 JSON 文档,以jq
将其作为 JSON 编码字符串插入到提供的“模板”中的适当位置。该结果被分配给payload
shell 变量,该变量稍后用作curl
选项的选项参数--data
。请注意,表达式中使用的变量(如
$dirs
和)是变量,而不是 shell 变量。它们从命令行上的选项获取它们的值。$project_key
jq
jq
--arg
jq
summary
作为和键的值的括号表达式description
被括在括号中,因为它们是需要计算以获得最终值的表达式。如果您需要创建
jq
包含非字符串数据的变量,例如,如果您需要插入布尔值、数字或 JSON 文档片段,请使用 in--argjson
代替--arg
(即jq ... --argjson components_id "$COMPONENT_ID" ...
,如果组件的 ID 应该是数字而不是一个字符串)。这对于评论来说太长了。(编辑:看来我会投票给隐形,请给一些建议来让自己振作起来。)(这从来不是为了投票,请将此视为一条评论,然后对那里的答案进行投票。)
首先要事。请语法高亮显示,除非代码块很琐碎(短,不是引用密集型等)。请参阅:什么是语法高亮显示以及它是如何工作的?。我写的是
```shell
,而不是```
在下面开始代码块。由于变量也是绿色的,所以它全部是绿色的,这没有多大帮助。为了保持一致性,我更新了前几个变量扩展。
这看起来不错,这本来就不是扩展问题。
如果您想确定,请运行带
echo
引号的数据块。最好将其通过管道传输到jq
,这应该会给出漂亮的 JSON 输出。最好深入研究Jira Rest Api Exaples或在 StackOverflow 上询问,因为问题既不是 BASH 也不是 Linux 问题。我检查了您的标志,它们与 Atlassian 网站上的内容相匹配,尽管其形式很长。
附录:
我已经评估了该命令的严格引用版本,因此@Kusalananda 是正确的,确实可能由于空格或特殊字符而出现引用错误。
然而,这个错误消息是Atlassian服务器的响应,curl确实工作正常。不过最好使用引用的版本。
另外,Atlassian 社区的一个帖子表明它可能是@
用户名中的。另一个附录
无论如何,只要凭据和 api 资源正确,curl 总是可以工作。它必须是一个新行或类似的行来预先终止数据块。因此标题中的错误。@Kusalananda 说得对。