我使用curl来获取http报头以查找http状态代码并返回响应。我使用命令获取http头信息
curl -I http://localhost
为了得到响应,我使用命令
curl http://localhost
一旦使用了-I标志,我就只得到了头信息,响应就不再存在了。是否有一种方法可以同时获得http响应和头/http状态码在一个命令?
我使用curl来获取http报头以查找http状态代码并返回响应。我使用命令获取http头信息
curl -I http://localhost
为了得到响应,我使用命令
curl http://localhost
一旦使用了-I标志,我就只得到了头信息,响应就不再存在了。是否有一种方法可以同时获得http响应和头/http状态码在一个命令?
当前回答
我发现这个问题是因为我想要独立访问响应和内容,以便为用户添加一些错误处理。
Curl允许您自定义输出。您可以打印HTTP状态代码以std输出并将内容写入另一个文件。
curl -s -o response.txt -w "%{http_code}" http://example.com
这允许您检查返回代码,然后决定是否值得打印、处理、记录响应等。
http_response=$(curl -s -o response.txt -w "%{http_code}" http://example.com)
if [ $http_response != "200" ]; then
# handle error
else
echo "Server returned:"
cat response.txt
fi
%{http_code}是一个由curl代替的变量。你可以做更多的事情,或者发送代码到stderr,等等。参见curl手册和——write-out选项。
-w, --write-out Make curl display information on stdout after a completed transfer. The format is a string that may contain plain text mixed with any number of variables. The format can be specified as a literal "string", or you can have curl read the format from a file with "@filename" and to tell curl to read the format from stdin you write "@-". The variables present in the output format will be substituted by the value or text that curl thinks fit, as described below. All variables are specified as %{variable_name} and to output a normal % you just write them as %%. You can output a newline by using \n, a carriage return with \r and a tab space with \t. The output will be written to standard output, but this can be switched to standard error by using %{stderr}.
https://man7.org/linux/man-pages/man1/curl.1.html
其他回答
哇,这么多答案,cURL开发人员肯定把它留给了我们作为家庭练习:)好吧,这是我的想法-一个脚本,使cURL工作,因为它应该是,即:
像cURL那样显示输出。 如果HTTP响应代码不在2XX范围内,则使用非零代码退出
保存为curl-wrapper.sh:
#!/bin/bash
output=$(curl -w "\n%{http_code}" "$@")
res=$?
if [[ "$res" != "0" ]]; then
echo -e "$output"
exit $res
fi
if [[ $output =~ [^0-9]([0-9]+)$ ]]; then
httpCode=${BASH_REMATCH[1]}
body=${output:0:-${#httpCode}}
echo -e "$body"
if (($httpCode < 200 || $httpCode >= 300)); then
# Remove this is you want to have pure output even in
# case of failure:
echo
echo "Failure HTTP response code: ${httpCode}"
exit 1
fi
else
echo -e "$output"
echo
echo "Cannot get the HTTP return code"
exit 1
fi
所以它就像往常一样,但不是curl do ./curl-wrapper.sh:
所以当结果在200-299范围内时:
./curl-wrapper.sh www.google.com
# ...the same output as pure curl would return...
echo $?
# 0
当结果超出200-299范围时:
./curl-wrapper.sh www.google.com/no-such-page
# ...the same output as pure curl would return - plus the line
# below with the failed HTTP code, this line can be removed if needed:
#
# Failure HTTP response code: 404
echo $?
# 1
只是不要传递“-w|——write-out”参数,因为这是脚本中添加的内容
我用过这个:
request_cmd="$(curl -i -o - --silent -X GET --header 'Accept: application/json' --header 'Authorization: _your_auth_code==' 'https://example.com')"
获取HTTP状态
http_status=$(echo "$request_cmd" | grep HTTP | awk '{print $2}')
echo $http_status
为了获得响应体,我使用了这个
output_response=$(echo "$request_cmd" | grep body)
echo $output_response
我发现这个问题是因为我想要独立访问响应和内容,以便为用户添加一些错误处理。
Curl允许您自定义输出。您可以打印HTTP状态代码以std输出并将内容写入另一个文件。
curl -s -o response.txt -w "%{http_code}" http://example.com
这允许您检查返回代码,然后决定是否值得打印、处理、记录响应等。
http_response=$(curl -s -o response.txt -w "%{http_code}" http://example.com)
if [ $http_response != "200" ]; then
# handle error
else
echo "Server returned:"
cat response.txt
fi
%{http_code}是一个由curl代替的变量。你可以做更多的事情,或者发送代码到stderr,等等。参见curl手册和——write-out选项。
-w, --write-out Make curl display information on stdout after a completed transfer. The format is a string that may contain plain text mixed with any number of variables. The format can be specified as a literal "string", or you can have curl read the format from a file with "@filename" and to tell curl to read the format from stdin you write "@-". The variables present in the output format will be substituted by the value or text that curl thinks fit, as described below. All variables are specified as %{variable_name} and to output a normal % you just write them as %%. You can output a newline by using \n, a carriage return with \r and a tab space with \t. The output will be written to standard output, but this can be switched to standard error by using %{stderr}.
https://man7.org/linux/man-pages/man1/curl.1.html
对于编程使用,我使用以下代码:
curlwithcode() {
code=0
# Run curl in a separate command, capturing output of -w "%{http_code}" into statuscode
# and sending the content to a file with -o >(cat >/tmp/curl_body)
statuscode=$(curl -w "%{http_code}" \
-o >(cat >/tmp/curl_body) \
"$@"
) || code="$?"
body="$(cat /tmp/curl_body)"
echo "statuscode : $statuscode"
echo "exitcode : $code"
echo "body : $body"
}
curlwithcode https://api.github.com/users/tj
显示如下信息:
statuscode : 200
exitcode : 0
body : {
"login": "tj",
"id": 25254,
...
}
while : ; do curl -sL -w "%{http_code} %{url_effective}\\n" http://host -o /dev/null; done