curl 将 http 代码写入 stderr 或文件

Gre*_*bet 7 curl

我正在编写一些脚本来测试 API。我对 JSON 响应以及请求的 HTTP 状态代码感兴趣。我绝对想漂亮地打印 JSON 响应,以便于阅读。

我正在curl用来执行请求并想python -m json.tool用来漂亮地打印 json 结果。

Curl 有一个不错的选项-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
Run Code Online (Sandbox Code Playgroud)

我得到

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

有没有办法配置curl将状态代码写入文件?-w手册页中的选项似乎没有提到将这些信息重定向到其他地方的可能性。

deF*_*tas 9

$ 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
Run Code Online (Sandbox Code Playgroud)

stderr 从此时开始,-w, --write-out 输出将被写入标准错误。(7.63.0 中添加)

stdout 从此时起,-w, --write-out 输出将被写入标准输出。这是默认设置,但可用于在切换到 stderr 后切换回来。(7.63.0 中添加)


Gre*_*bet 3

我找到了解决此问题的方法,即-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
Run Code Online (Sandbox Code Playgroud)