如何从cURL 8.0中获取HTTP状态码错误信息?
解决cURL检测HTTP非成功状态码的问题
首先明确:你遇到的情况不是cURL的HTTP/2 Bug。cURL的$?退出码仅表示「请求是否完成传输」——只要服务器返回了响应(哪怕是405这类错误状态),传输过程没出错,cURL就会返回0。这是cURL的设计逻辑,和HTTP版本无关。
要可靠检测非成功HTTP状态码,有几种实用方法:
用
-f参数让cURL在错误状态码时返回非0退出码
加上-f后,当HTTP状态码≥400时,cURL会直接返回非0退出码,同时默认会抑制错误响应的输出。如果需要保留响应内容,可以结合-o -(将输出定向到标准输出):curl -f -u monitor -o - 'https://redacted.server.name/api/status/get-token' echo $? # 405状态下会返回非0值若想同时看到错误提示,可搭配
-sS(静默模式但保留错误输出):curl -f -sS -u monitor 'https://redacted.server.name/api/status/get-token'用
-w参数输出HTTP状态码
通过-w自定义输出格式,在响应末尾追加HTTP状态码,之后可以通过脚本提取判断:curl -u monitor -w "\n%{http_code}" 'https://redacted.server.name/api/status/get-token' # 输出会在JSON后多一行状态码,比如405若要单独获取状态码,可结合
-s(静默模式)和-o /dev/null(丢弃响应体):HTTP_STATUS=$(curl -s -u monitor -o /dev/null -w "%{http_code}" 'https://redacted.server.name/api/status/get-token') if [ "$HTTP_STATUS" -ge 400 ]; then echo "请求失败,状态码:$HTTP_STATUS" fi用
-I参数查看响应头(注意请求方法变化)-I会发送HEAD请求,仅返回响应头,其中包含状态码。但要注意,HEAD请求的服务器行为可能和原GET请求不同,需谨慎使用:curl -I -u monitor 'https://redacted.server.name/api/status/get-token'
内容的提问来源于stack exchange,提问作者U. Windl
相关产品推荐
相关产品推荐

