Как вставить переменную bash в тело JSON запроса GraphQL cURL POST

Я часами пытался отформатировать свое тело сообщения json, чтобы мой скрипт был счастлив, но мне не повезло. В моем коде ниже я хотел бы использовать переменную $utc_format в качестве значения для ключа datetime_gt.

#!/bin/bash

utc_format=$(date -v-3d -v-5M -u +"%Y-%m-%dT%H:%M:%SZ")

curl \
    -X POST \
    -H "Content-Type: application/json" \
    -H "X-Auth-Email: [email protected]" \
    -H "X-Auth-key: $API_KEY" \
    --data '{"query": "query { viewer { zones ( filter: { zoneTag_in: [ \"abcde12345\" ] } ) { firewallEventsAdaptive ( filter: { source: \"waf\" datetime_gt: \"$utc_format\" ruleId: \"123456\" action: \"simulate\" } orderBy: [ datetime_DESC ] limit: 100 ) { clientIP edgeResponseStatus metadata { key value } } } } }"}' \
    https://api.api.com/ \
    | python -m json.tool >> curl_results

Я даже пытался сделать что-то вроде:

generate_post_data()
{
cat <<EOF
{
<json data>
}
EOF
}

но я получил сообщение об ошибке

"message": "failed to recognize JSON request: 'invalid character '\\n' in string literal'"

:'(

Заранее спасибо!

воспользуйтесь поиском....

xadm 19.12.2020 10:10
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
1
440
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Сообщение буквально означает, что у вас есть разрыв строки в теле json. Попробуйте убрать разрыв строки, может поможет.

curl \
    -X POST \
    -H "Content-Type: application/json" \
    -H "X-Auth-Email: [email protected]" \
    -H "X-Auth-key: $API_KEY" \
    --data "$(generate_post_data | tr -d '\n')" \
    https://api.api.com/ \
    | python -m json.tool >> curl_results

Я сделал это и получил: «сообщение»: «не удалось распознать запрос JSON:« недопустимый символ »\\ t »в строковом литерале»

jayteezer 21.12.2020 02:33

@jayteezer В этом случае вы можете удалить символ табуляции вместе с --data "$(generate_post_data | tr -d '\n\t')"

Taylor G. 21.12.2020 23:37

Гораздо лучше, чем удалять эти символы, было бы правильно экранировать их, например, используя jq для генерации данных.

Charles Duffy 21.10.2021 19:14

Другие вопросы по теме