Как использовать канал сценария оболочки json для завивки, чтобы отправить слабое сообщение

У меня есть API-интерфейс монитора (например: www.example.com/monitor), который хорошо возвращает статус системы в формате JSON, например:

{
   "foo" : 1000,
   "bar" : 100
}

Я хочу использовать curl для получения статуса системы из этого API и передачи в Slack.

Ниже приведен мой текущий сценарий.

status=$(curl "http://www.xample.com/monitor/status" )
slackWebHook = "https://hooks.slack.com/services/xxxxx/xxxxx/xxxxx"

function sentSlack () {
 json_template='{
    channel:    $channel,
    username:   $username,
    text:       $text,
    icon_emoji: $icon_emoji,
    attachments: [$attachments]
  }'

  jq -n --arg channel  "#unicorn_log" \
       --arg username "Kuasa Search Report" \
       --arg text     "${msg}"\
       --arg icon_emoji "chart_with_upwards_trend" \
       --arg attachments "${status}" "$json_template" |
       curl -i -X POST --data-urlencode "$(</dev/stdin)"  ${slackWebHook}

}

sentSlack

Я всегда получаю недопустимая_полезная нагрузка , потому что статус экранируется.

{
   \"foo\" : 1000,
   \"bar\" : 100
}

Как правильно передать JSON в полезную нагрузку Slack?

Неважно для вашего вопроса, но в стороне, function name() { объединяет два разных варианта синтаксиса - устаревший синтаксис ksh function name { и синтаксис, совместимый с POSIX name() { - в комбинации, которая несовместима с устаревшим либо ksh или POSIX sh стандарт. (Более того, bash не учитывает особое значение function в ksh, контролируя, являются ли переменные declared локальными по умолчанию). Лучше придерживаться одного или другого; см. wiki.bash-hackers.org/scripting/устаревший

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

Ответы 1

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

--arg key value рассматривает значение как строку. Поскольку строка, содержащая литерал ", должна быть дополнена экранированием, чтобы быть допустимой в JSON, именно это и делает jq.

--argjson key value, напротив, анализирует value как текст JSON; что, кажется, то, что вы хотите сделать здесь.

Замените --arg attachments "$status" на --argjson attachments "$status".

спасибо, я меняю на --argjson и повторяю результат echo $(</dev/stdin), и это кажется правильным, но все равно получаю invalid_payload

howie 08.04.2019 15:32

Можете ли вы заставить curl работать вручную, поэтому единственный вопрос заключается в том, как заставить вывод jq соответствовать заведомо хорошему примеру? В противном случае мы потенциально находимся в пространстве, где кому-то нужно знать API Slack, а не только jq или bash.

Charles Duffy 08.04.2019 16:47

@howie, ... тем не менее, вопрос об API вполне может подойти для сайта - если вы в конечном итоге пришли к выводу, что застряли в понимании того, как использовать curl для отправки этого сообщения даже после исключения jq и bash-специфических частей из вопроса, не стесняйтесь редактировать вопрос, чтобы сосредоточиться на этой нерешенной проблеме; Я снова открою его и удалю этот ответ.

Charles Duffy 08.04.2019 16:59

хорошо~ Я проверю, что не так с slack API~:D

howie 09.04.2019 01:25

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