カールはstderrまたはファイルにhttpコードを書き込みます。

カールはstderrまたはファイルにhttpコードを書き込みます。

APIをテストするためにいくつかのスクリプトを書いています。 JSONレスポンスとリクエストのHTTPステータスコードに興味があります。読みやすくするためにJSONレスポンスをきれいに印刷したいです。

私はリクエストを実行するために使用しており、これを使用してjsonの結果をきれいに印刷したいとcurl思います。python -m json.tool

カリー良い選択-wリクエストに関する情報を表示するために使用できます。%{http_code}残念ながら、この情報は標準出力として印刷されて混乱します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この情報を他の場所にリダイレクトする可能性が記載されていないようです。

答え1

$ curl -s -k -w '%{stderr}%{http_code}\n%{stdout}\n' \
  https://run.mocky.io/v3/0e98ba3e-335e-421b-b762-884d2bf613ba |\
  tee /dev/stderr | jq -r '.name'
200
{
    "name": "Grape"
}
Grape

標準エラー この時点から、-w、--write-out出力は標準エラーに書き込まれます。 (7.63.0で追加)

標準出力 この時点から、-w、--write-out出力が標準出力に書き込まれます。これはデフォルト設定ですが、stderrに切り替えてから再度切り替えるために使用できます。 (7.63.0で追加)

答え2

-oコンテンツを一時ファイルにリダイレクトし、カール出力にステータスコードのみを保持して、この問題に対する解決策を見つけました。

その後、一時ファイルの内容を読み取って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

答え3

使用する場合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出力をパイプで使用したりファイルにリダイレクトしたりするには、「filter」パラメータを指定する必要があると思います。

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

.最も簡単なフィルターです。これは、「入力を受けてそれを未変更の出力として生成する」という意味です。

答え4

書き込みは出力-wにのみ移動でき、任意のファイルにリダイレクトできます。特に を使用して で指定できます。これで(使用)に切り替えると、出力を目的のプログラムにパイプしながらstderrを介してHTTPリターンコードを表示できます。stdout-ostderr-o /dev/stderrstderrstdout3>&1- 1>&2- 2>&3-

つまり、次のように進みます。

curl ... -w 'HTTP_STATUS_CODE: %{http_code}\n' -o /dev/stderr ... | 3>&1- 1>&2- 2>&3- | python -m json.tool

関連情報