是的,这与让 curl 输出 HTTP 状态代码?但不幸的是不一样。
在脚本中我想运行:
curl -qSfsw %{http_code} URL
其中该-f
选项确保退出代码不为零以发出错误信号。成功时,我希望从获取的文件中获取(文本)输出,否则我希望使用错误代码。
问题:
- 由于竞争条件,我不能使用多个 HTTP 请求
- 我无法使用临时文件来存储内容
我怎样才能将 HTTP 返回代码与实际输出分离?
伪代码:
fetch URL
if http-error then
print http-error-code
else
print http-body # <- but without the HTTP status code
endif
答案1
无需使用临时文件。以下 bash 脚本片段发送单个请求并curl
根据需要打印退出代码和 HTTP 状态代码,或 HTTP 状态代码和响应。
# get output, append HTTP status code in separate line, discard error message
OUT=$( curl -qSfsw '\n%{http_code}' http://superuser.com ) 2>/dev/null
# get exit code
RET=$?
if [[ $RET -ne 0 ]] ; then
# if error exit code, print exit code
echo "Error $RET"
# print HTTP error
echo "HTTP Error: $(echo "$OUT" | tail -n1 )"
else
# otherwise print last line of output, i.e. HTTP status code
echo "Success, HTTP status is:"
echo "$OUT" | tail -n1
# and print all but the last line, i.e. the regular response
echo "Response is:"
echo "$OUT" | head -n-1
fi
head -n-1
(打印除最后一行之外的所有内容)需要 GNU,不适用于 BSD/OS X。