我一直认为当 curl 收到 HTTP 500 响应时,它会返回一个表示失败的退出代码 (!= 0),但这似乎是不是案子。
如果 HTTP 状态代码不是 200,是否有办法让 cURL 失败,并且 exitCode 不为 0?我知道我可以使用,-w "%{http_code}"
但这会将其放在 STDOUT 中,而不是作为退出代码(此外,我还对捕获输出感兴趣,我不想将其重定向到文件,而是重定向到屏幕)。
答案1
到目前为止提供的大多数答案都不会在 HTTP 请求失败时打印 HTTP 响应正文。
如果您还想打印响应主体,即使由于 HTTP 请求失败导致退出代码非零:只要您有 curl v7.76 或更新版本,只需使用curl --fail-with-body
。
对于旧版本的 curl,请尝试以下操作:
curlf() {
OUTPUT_FILE=$(mktemp)
HTTP_CODE=$(curl --silent --output $OUTPUT_FILE --write-out "%{http_code}" "$@")
if [[ ${HTTP_CODE} -lt 200 || ${HTTP_CODE} -gt 299 ]] ; then
>&2 cat $OUTPUT_FILE
return 22
fi
cat $OUTPUT_FILE
rm $OUTPUT_FILE
}
答案2
curl --fail
完成您想要的部分:
从man curl
:
-f, --fail
(HTTP)服务器出错时静默失败(完全不输出)。这样做主要是为了更好地启用脚本等来更好地处理失败的尝试。在正常情况下,当 HTTP 服务器无法提供文档时,它会返回一个 HTML 文档来说明原因(通常还会描述原因等)。此标志将阻止 curl 输出该信息并返回错误 22。
这种方法并不万无一失,有时会出现不成功的响应代码,尤其是涉及身份验证时(响应代码 401 和 407)。
但它会阻止屏幕输出。
答案3
如果你只想显示卷曲页面的内容,可以这样做:
STATUSCODE=$(curl --silent --output /dev/stderr --write-out "%{http_code}" URL)
if test $STATUSCODE -ne 200; then
# error handling
fi
这会将页面内容写入 STDERR,同时将 HTTP 状态代码写入 STDOUT,因此可以将其分配给变量状态码。
答案4
我能够使用标志组合来完成此操作:
curl --silent --show-error --fail URL
- 沉默的隐藏进度和错误
--显示错误显示隐藏的错误信息--silent
- 失败当请求失败时返回退出代码 > 0