kno*_*cte 389 curl stdout http-status-code-500 exit-code
我一直假设当 curl 收到 HTTP 500 响应时,它会返回一个退出代码,这意味着失败 (!= 0),但事实并非如此。
如果 HTTP 状态代码不是 200,有没有一种方法可以使 cURL 失败,并且退出代码不同于 0?我知道我可以使用,-w "%{http_code}"
但这将它放在 STDOUT 中,而不是作为退出代码(此外,我也对捕获输出感兴趣,我不想重定向到文件,而是重定向到屏幕)。
ram*_*ion 413
curl --fail
做你想要的一部分:
来自man curl
:
-f, --fail
(HTTP) 在服务器错误时静默失败(根本没有输出)。这样做主要是为了更好地启用脚本等以更好地处理失败的尝试。在正常情况下,当 HTTP 服务器无法传递文档时,它会返回一个 HTML 文档,说明如此(通常也描述了原因等等)。此标志将阻止 curl 输出并返回错误 22。
这种方法不是万无一失的,有时会漏掉不成功的响应代码,尤其是在涉及身份验证时(响应代码 401 和 407)。
但它阻止输出到屏幕。
Den*_*nis 118
如果只想显示卷曲页面的内容,可以这样做:
STATUSCODE=$(curl --silent --output /dev/stderr --write-out "%{http_code}" URL)
if test $STATUSCODE -ne 200; then
# error handling
fi
Run Code Online (Sandbox Code Playgroud)
这会将页面内容写入 STDERR,同时将 HTTP 状态代码写入 STDOUT,因此可以将其分配给变量STATUSCODE。
小智 78
我能够使用标志的组合来做到这一点:
curl --silent --show-error --fail URL
Run Code Online (Sandbox Code Playgroud)
--silent隐藏进度和错误
--show-error显示由--silent
--fail隐藏的错误消息,当请求失败时返回退出代码 > 0
phe*_*mer 21
使用--fail-with-body
. curl
当响应代码 >=400 时,这将导致以状态代码 22 退出。
请注意,此标志是全新的(截至 2021 年 2 月 15 日),并已添加到版本 7.76.0 中,该版本晚于 @rampion的回答。因此,它可能在您的系统上不可用。
https://curl.se/docs/manpage.html
-- 身体失败
(HTTP) 在 HTTP 响应代码为 400 或更大的服务器错误时返回错误)。在正常情况下,当 HTTP 服务器无法传递文档时,它会返回一个 HTML 文档,说明如此(通常也描述了原因等等)。此标志仍将允许 curl 输出和保存该内容,但也会返回错误 22。
这是 -f, --fail 的替代选项,它使 curl 在相同情况下失败但不保存内容。
另请参见 -f、--fail。在 7.76.0 中添加。
-f, --失败
(HTTP) 在服务器错误时静默失败(根本没有输出)。这样做主要是为了使脚本等能够更好地处理失败的尝试。在正常情况下,当 HTTP 服务器无法传递文档时,它会返回一个 HTML 文档,说明如此(通常也描述了原因等等)。此标志将阻止 curl 输出并返回错误 22。
这种方法不是万无一失的,有时会漏掉不成功的响应代码,尤其是在涉及身份验证时(响应代码 401 和 407)。
另见--fail-with-body。
小智 14
我最终根据Dennis 的回答得到了这个结果,这是一个快速的单行代码,对于非 200 状态代码失败,同时保留输出(到stderr
):
[ $(curl ... -o /dev/stderr -w "%{http_code}") -eq 200 ]
Run Code Online (Sandbox Code Playgroud)
小智 8
如果请求失败,到目前为止提供的大多数答案都不会返回 HTTP 响应正文。如果您想打印退出代码的响应,并且如果 http 请求失败,退出代码为非零,请尝试以下操作:
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
}
Run Code Online (Sandbox Code Playgroud)
(除非你有 curl v7.76+。然后使用curl --fail-with-body
.)
是的,有一种方法可以做到,但远非显而易见,因为它涉及 3 个卷曲选项:
curl -s --fail --show-error https://httpbin.org/status/200 > /dev/null
curl -s --fail --show-error https://httpbin.org/status/401 > /dev/null
curl -s --fail --show-error https://httpbin.org/status/404 > /dev/null
curl -s --fail --show-error https://bleah-some-wrong-host > /dev/null
Run Code Online (Sandbox Code Playgroud)
这确保了成功 (0) 仅在 curl 以最终2xx
返回代码结束并stdout
获取正文时发生,并且任何错误都将显示到 stderr。
请注意,curl 文档可能会让您有点困惑,因为它提到 --fail 可能会成功处理某些 401 代码。基于不正确的测试,至少在与 --show-error 同时使用时不会。
到目前为止,我无法找到任何情况,当 curl 不是 http-succeds 与这些选项时会返回成功。
归档时间: |
|
查看次数: |
187811 次 |
最近记录: |