Правильный формат для многострочного '--data' в запросе curl к конечной точке graphql?

Я передаю "--data" через curl в конечную точку API GraphqQL.

Я хочу иметь возможность передавать данные в «предопределенной» форме, например как в браузере GraphiQL,

{
  alpha {
    param1
    param2
  }
}

Атм, мое форматирование внутри данных, а именно возврат re: line, не обрабатывается должным образом.

Эта однострочная форма работает,

curl \
 -H 'content-type: application/json' \
 -X POST /path/to/graphql/api/endpoint \
 --data '{ "query":
           "query { alpha {param1, param2} } "
         }'

Эта "усовершенствованная" версия не

curl \
 -H 'content-type: application/json' \
 -X POST /path/to/graphql/api/endpoint \
 --data '{ "query":
           "query {
              alpha {
                param1
                param2
              }
            } "
         }'

Какой правильный синтаксис для передачи второй формы?

Я предполагаю какую-то комбинацию цитирования / экранирования?

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
6
0
2 954
2

Ответы 2

Новые строки просто недопустимы внутри строк JSON. (См. RFC 8259 §7, в котором говорится, что управляющие символы должны быть экранированы.) Вы можете превратить новую строку в \n, но это становится немного громоздким:

curl \
 -H 'content-type: application/json' \
 -X POST /path/to/graphql/api/endpoint \
 --data '{ "query":
           "query {\n  alpha {\n    param1\n    param2\n  }\n} "
         }'

Поскольку запросы JSON довольно хорошо структурированы, кажется, лучше использовать специальный инструмент для отправки запросов GraphQL: автономная версия GraphiQL - нормальный вариант по умолчанию, или, если у вас есть любимый язык сценариев с разумным HTTP-клиентом, это легко достаточно, чтобы написать что-нибудь с этим.

Что-то вроде этого:

QUERY='{ "query":
           "query {
              alpha {
                param1
                param2
              }
            } "
         }'
curl \
 -H 'content-type: application/json' \
 -X POST /path/to/graphql/api/endpoint \
 --data "$(echo $QUERY)"

Вот что мне пришлось сделать: --data "${QUERY//$'\n'/}". Это может работать не во всех случаях, но для моего простого случая использования это сработало.

snasirca 19.11.2021 18:11

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