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 구문 분석 오류"가 발생합니다. 디버깅하는 동안 body 의 요약 및 설명에서 변수 DIR_CHANGED
및 가 잘못 사용되는 것이 문제라는 것을 발견했습니다 MODEL_NAME
. 다른 방법을 제안해 주실 수 있나요?
답변1
셸 변수의 실제 내용을 모르기 때문에 적어도 하나에 개행, 탭, 큰따옴표 또는 JSON 문서에서 인코딩해야 할 수 있는 기타 문자가 포함되어 있다고 가정합니다. 일반적으로 JSON에 셸 문자열을 삽입하지 마세요. jq
셸 변수에서 유효한 JSON을 만드는 데 사용됩니다 . 이렇게 하면 문자열이 올바르게 인코딩됩니다.
아래 스크립트 조각에서는 사용된 5개의 셸 변수가 jq
예상 값으로 설정되었다고 가정합니다. 그런 다음 스크립트는 jq
제공된 "템플릿"의 적절한 위치에 JSON 인코딩 문자열로 삽입될 셸 변수를 제공하여 JSON 문서를 생성합니다. 결과는 나중에 옵션 의 옵션 매개변수 payload
로 사용되는 쉘 변수 에 할당됩니다 .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
and, 등의 표현식에 사용되는 변수에 유의하세요 .$project_key
jq
jq
변수 이다, 쉘 변수가 아닙니다. 명령줄 --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 예또는 질문이 BASH나 Linux 문제가 아니기 때문에 StackOverflow에 문의하세요. 귀하의 로고를 확인한 결과 매우 긴 형식이지만 Atlassian 웹사이트에 있는 로고와 일치합니다.
부록:
엄격하게 인용된 버전의 명령을 평가했으므로 @Kusalananda가 정확합니다. 실제로 공백이나 특수 문자로 인해 인용 오류가 발생할 수 있습니다.
그러나 이 오류 메시지는 Atlassian 서버의 응답이며 컬은 제대로 작동합니다. 그러나 인용된 버전을 사용하는 것이 가장 좋습니다.
또한Atlassian 커뮤니티 주제제안@
사용자 이름에 있을 수 있습니다.
또 다른 부록
그럼에도 불구하고 자격 증명과 API 리소스가 올바른 한 컬은 항상 작동합니다. 데이터 블록을 미리 종료하려면 새 줄이나 이와 유사한 줄이어야 합니다. 그래서 제목에 오류가 있습니다. @Kusalananda 말이 맞아요.