오류 '{"errorMessages" 발생: ["JSON을 구문 분석하는 동안 오류가 발생했습니다. 요청 본문이 유효한지 확인하세요. "]}

오류 '{"errorMessages" 발생: ["JSON을 구문 분석하는 동안 오류가 발생했습니다. 요청 본문이 유효한지 확인하세요. "]}
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'

$dirsand, 등의 표현식에 사용되는 변수에 유의하세요 .$project_keyjqjq변수 이다, 쉘 변수가 아닙니다. 명령줄 --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 말이 맞아요.

관련 정보