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

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

#1 楼

curl --fail满足了您想要的部分功能:
来自man curl

-f, --fail
(HTTP)服务器错误时静默失败(根本没有输出)。这样做主要是为了更好地使脚本等能够更好地处理失败的尝试。在正常情况下,当HTTP服务器无法交付文档时,它会返回HTML文档,说明其内容(通常还会说明原因以及更多内容)。此标志将防止curl输出该错误并返回错误22。
此方法不是故障安全的,并且在某些情况下会漏掉不成功的响应代码,尤其是在涉及身份验证时(响应代码401和407) 。

但是阻止输出到屏幕。

评论


那么它的哪些部分起作用和不起作用?

–rogerdpack
16年7月18日在4:45

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

–横行
16年7月18日在7:50

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

– Wisbucky
18年5月11日在22:46

@wisbucky 301不是错误,它是重定向状态代码。错误是4xx和5xx状态代码。

–贾斯汀·M
18年8月8日在20:40

@wisbucky要在HTTP错误代码上退出非零值并正确处理HTTP重定向,请使用curl -f -L,有关-L的详细信息,请参见此问题。

–诺亚·萨斯曼(Noah Sussman)
19-4-24在17:49



#2 楼

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

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

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


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

评论


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

–贾斯汀
2015年5月3日23:08



@Justin:如果[“ $ statuscode” -ne 200];怎么办?然后退出“ $ statuscode”; fi?

–ghoti
15年6月16日在14:51

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

–丹尼斯
15年6月16日在16:53

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

–ghoti
15年6月17日在20:46

作为一个细微的变化,它在将响应重定向到stdout而不是stderr时捕获了变量中的代码: } 2>&1诀窍是{...} 2>&1允许重定向,而不像(...)那样生成另一个shell。

– Tobia
17年5月23日在16:44



#3 楼

我能够使用以下标志组合来做到这一点:请求失败时,-fail返回退出代码> 0

评论


这不会显示服务器回复。我不是OP,但我怀疑他想查看来自服务器的任何错误消息,这些消息在正文中返回。除了--silent --show-error --fail的功能与-f /-fail相同。

–浪费
17-10-20在1:12

实际上,--fail返回退出代码22,如所记录。

– Quolonel问题
17年11月10日在5:03

@wisbucky 301不是错误,它是重定向状态代码。错误是4xx和5xx状态代码。

–贾斯汀·M
18年8月8日在20:40



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

– ken
18/09/11在17:11

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

–有福
19 Mar 10 '19在9:53

#4 楼

是的,有一种方法可以做到,但远不很明显,因为它涉及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


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

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

评论


这与里卡多·索扎(Ricardo Souza)的答案基本相同吗?

– knocte
19年9月4日在16:18

#5 楼

我最近还需要类似的东西,但我也想一直打印输出。我使用http_code提取和grep来实现这一点。

  out=$(curl -H"Content-Type: application/json"  -w '\nstatus_code=%{http_code}\n' -s http://localhost:4040${uri} -d "${body}")
  code=$(echo ${out}|grep status_code|awk -F"=" '{print }')
  echo ${out}
  if [[ ${code} -ge 400 ]];
  then
    exit 2;
  fi;


#6 楼

我根据Dennis的答案得出了这一结论,这是一种快速的单行代码,它在非200状态代码失败的同时保留了输出(到stderr):

#7 楼

这基于@Dennis的解决方案,但仅显示错误时的输出(返回码不是200):
 #!/bin/bash

# Create temp file
SCRATCH=$( mktemp -t tmp.XXXXXXXXXX )
# Cleanup temp file on script exit
function cleanup_on_exit {
    rm -f "$SCRATCH"
}
trap cleanup_on_exit EXIT

# Perform curl call
HTTP_CODE=$( curl -s -o "$SCRATCH" -w '%{http_code}' your..stuff..here )

# Analyze HTTP return code
if [[ ${HTTP_CODE} -ne 200 ]] ; then
    cat "${SCRATCH}"
    exit 1
fi
 

替代HTTP返回代码处理,其中2XX正确:
 # Analyze HTTP return code
if [[ ${HTTP_CODE} -lt 200 || ${HTTP_CODE} -gt 299 ]] ; then
    cat "${SCRATCH}"
    exit 1
fi