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