Intereting Posts
Игнорировать ингибиторы sshd при перезагрузке Исключение вложенных каталогов с помощью grep Почему linux использует swap-память, когда еще нет неиспользованной физической памяти ImportError: libavcodec.so.56: невозможно открыть файл общих объектов: нет такого файла или каталога Не удается смонтировать жесткий диск EXT4 после установки в окнах Как я могу постоянно устанавливать разрешения на работу rw на ubuntu 16.04? Как интегрировать Debian netinstall в существующую конфигурацию PXE? синтаксис синтаксиса bash и ;; терминаторы С учетом исключения ядра ATA, как определить, на какой физический диск влияет? Установка Fedora 16 не полностью завершена KSH / BASH Максимальный размер массива Файл конфигурации GIMP 2.9.4 не распознает установленные библиотеки WiFi Broadcom 4306 не будет подключаться Управляйте только частью конфигурационного файла с помощью Puppet (многострочная файловая строка) Что делает exec $ SHELL -l?

curl написать http-код для stderr или в файл

Я пишу несколько скриптов для тестирования API. Меня интересует ответ JSON, а также код состояния HTTP запроса. Я определенно хочу довольно-таки распечатать ответ JSON, чтобы упростить его чтение.

Я использую curl для выполнения запроса и хочу использовать python -m json.tool для python -m json.tool чтобы печатать результат json.

Curl имеет хороший вариант -w который можно использовать для получения информации о запросе, например %{http_code} . К сожалению, эта информация печатает в stdout и смущает python -m json.tool . Кажется, что невозможно сконфигурировать его, чтобы игнорировать конечные не-json-данные.

Когда я делаю

 curl \ '--silent' \ '--insecure' \ '-L' \ '-w' \ '\n%{http_code}\n' \ '--user' \ <REDACTED> \ '-X' \ 'GET' \ '--' \ 'https://somecompany.com/some_api_endpoint' \ | python -m json.tool 

я получил

 $ bash call_api_endpoint_script.sh Extra data: line 2 column 1 - line 3 column 1 (char 203 - 207) Exit 1 

Есть ли способ настроить curl чтобы записать код состояния в файл? Параметр -w на странице руководства, похоже, не упоминает о возможности перенаправления этой информации в другом месте.

Если вы используете jq вместо python -m json.tool , вы обнаружите, что он анализирует JSON даже с завершающим текстом:

 $ echo '{ "foo": "bar" } text' | ./jq { "foo": "bar" } parse error: Invalid literal at line 2, column 0 

Конечно, если вы хотите проигнорировать сообщение об ошибке, вы можете просто перенаправить его в /dev/null .

Также обратите внимание, что с jq если вы хотите использовать его вывод в jq или перенаправить его в файл, я думаю, вам нужно дать ему аргумент «filter»:

 echo '{ "foo": "bar" } trailing text' | jq . > OUT.json 

. это просто самый простой фильтр. Это означает «принять вход и произвести его без изменений в качестве вывода».

Я нашел способ обойти эту проблему, используя -o для перенаправления только содержимого во временный файл, оставив только код состояния в выходе curl.

Затем я могу прочитать содержимое временного файла из python -m json.tool и довольно печатать их.

Например,

 content=$(mktemp) curl \ ... -w \ 'HTTP_STATUS_CODE: %{http_code}\n' \ ... -o \ "$content" \ -- \ 'https://somecompany.com/some_api_endpoint' <"$content" python -m json.tool 

Я определенно хочу довольно-таки распечатать ответ JSON, чтобы упростить его чтение.

Это именно то, для чего предназначен https://httpie.org/ . отправляя GET, POST, PUT, DELETE, PATCH и т. д. API и довольно печатный ответ JSON.


Что касается скрученной части вашего вопроса, у меня нет подсказки, извините.