如果HTTP状态代码不是200,是否可以使cURL的exitCode不同于0,从而失败?


237

我一直以为curl在收到HTTP 500响应时会返回表示失败(!= 0)的退出代码,但事实并非如此。

如果HTTP状态代码不是200,有没有办法使cURL的exitCode不同于0,我会失败吗?我知道我可以使用,-w "%{http_code}"但是可以将它放在STDOUT中,而不是作为退出代码(此外,我也很想捕获输出,我不想将其重定向到文件,而是重定向到屏幕)。

Answers:


262

curl --fail 做你想要的一部分:

来自man curl

-f, --fail

(HTTP)在服务器错误时静默失败(根本没有输出)。这样做主要是为了更好地使脚本等能够更好地处理失败的尝试。在正常情况下,当HTTP服务器无法交付文档时,它会返回一个HTML文档,说明其内容(通常还说明原因以及更多内容)。该标志将阻止curl输出该错误并返回错误22。

此方法不是故障安全的,并且有时会漏掉不成功的响应代码,尤其是在涉及身份验证时(响应代码401和407)。

但是它阻止输出到屏幕。


2
那么它的哪些部分起作用和不起作用?
rogerdpack '16

5
@rogerdpack tl; dr在检测到错误响应时确实返回非零值,但不会让OP捕获响应

3
这不能捕获HTTP 301永久移动。curl仍然给出了退出代码
0。– wisbucky

4
@wisbucky 301并非错误,它是重定向状态代码。错误是4xx和5xx状态代码。
贾斯汀·马

1
@wisbucky会在HTTP错误代码上退出非零值正确处理HTTP重定向curl -f -L,请参阅此问题以获取详细信息-L
诺亚·萨斯曼

81

如果只想显示卷曲页面的内容,则可以执行以下操作:

STATUSCODE=$(curl --silent --output /dev/stderr --write-out "%{http_code}" URL)

if test $STATUSCODE -ne 200; then
    # error handling
fi

这会将页面的内容写入STDERR,同时将HTTP状态代码写入STDOUT,因此可以将其分配给变量STATUSCODE


3
如果我要输出失败响应(非200),但从0脚本返回非状态代码怎么办?
贾斯汀

2
@贾斯汀:那if [ "$statuscode" -ne 200 ]; then exit "$statuscode"; fi呢?
ghoti 2015年

4
@ghoti:仅支持无符号的8位退出代码,因此可能会造成一些混乱。
丹尼斯

3
啊,对了-代码将以8位换行,因此错误404变为退出值148,500变为244。的确令人困惑!:-)
ghoti 2015年

7
作为一个细微的变化,它在将响应重定向到stdout而不是stderr时捕获了变量中的代码:{ code=$(curl ... as above ...); } 2>&1诀窍是{ ... } 2>&1允许重定向,而不会产生其他shell ( ... )
托比亚

31

我能够使用组合标志来做到这一点:

curl --silent --show-error --fail URL

--silent隐藏进度和错误
--show-error显示被--silent
--fail隐藏的错误消息,当请求失败时,返回退出代码> 0


5
这不会显示服务器回复。我不是OP,但我怀疑他想查看从服务器返回的任何错误消息,这些消息在正文中返回。除了一件--silent --show-error --fail与正义一样的作品-f/--fail
浪费

1
其实,--fail返回退出代码22如记录
Quolonel Questions'Nov

2
@wisbucky 301并非错误,它是重定向状态代码。错误是4xx和5xx状态代码。
贾斯汀·马

4
为了公平起见,@ wisbucky,原始问题指出“ [...],如果HTTP状态代码不是200”。之前没有提到“错误”。
肯'18

2
@ M.Justin根据curl手册页:此方法不是故障安全的,并且有时会漏入不成功的响应代码,特别是在涉及身份验证时(响应代码401和407)。
youfu

0

是的,有一种方法可以做到,但远非显而易见,因为它涉及3个curl选项:

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

这样可以确保只有在卷曲最终结束并最终2xx返回代码时才成功(0),并且成功stdout获取主体,并且任何错误都将显示给stderr。

请注意,curl文档可能会使您有些困惑,因为它提到--fail对于某些401代码可能成功。基于不正确的测试,至少不是与--show-error同时使用时才如此。

到目前为止,我无法找到在没有使用这些选项的http成功的情况下curl将返回成功的任何情况。


1
这与里卡多·索扎(Ricardo Souza)的答案基本相同吗?
knocte
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.