如果 HTTP 状态代码不是 200,我可以让 cURL 失败并且 exitCode 不为 0 吗?

如果 HTTP 状态代码不是 200,我可以让 cURL 失败并且 exitCode 不为 0 吗?

我一直认为当 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

相关内容