我使用curl来获取http报头以查找http状态代码并返回响应。我使用命令获取http头信息

curl -I http://localhost

为了得到响应,我使用命令

curl http://localhost

一旦使用了-I标志,我就只得到了头信息,响应就不再存在了。是否有一种方法可以同时获得http响应和头/http状态码在一个命令?


当前回答

要获得响应代码和响应:

$ curl -kv https://www.example.org

要得到响应代码:

$ curl -kv https://www.example.org 2>&1 | grep -i 'HTTP/1.1 ' | awk '{print $3}'| sed -e 's/^[ \t]*//'

2>&1:错误存储在输出中,用于解析 Grep:从输出中过滤响应代码行 Awk:从响应代码行中过滤响应代码 Sed:删除前导空白

其他回答

我的方法是:

为了获得两者(标题和正文),我通常执行curl - d - <url>,如:

$ curl -D- http://localhost:1234/foo
HTTP/1.1 200 OK
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json
Date: Wed, 29 Jul 2020 20:59:21 GMT

{"data":["out.csv"]}

这将转储标题(- d)到stdout(-)(在man curl中查找——dump-header)。

恕我直言,在这种情况下也很方便:

我经常使用jq来获得json数据(例如从一些其他api)格式化。但是由于jq不需要HTTP标头,诀窍是使用-D/dev/stderr将标头打印到stderr。注意,这次我们还使用-sS(——silent,——show-errors)来抑制进度表(因为我们写入管道)。

$ curl -sSD/dev/stderr http://localhost:1231/foo | jq .
HTTP/1.1 200 OK
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json
Date: Wed, 29 Jul 2020 21:08:22 GMT

{
  "data": [
    "out.csv"
  ]
}

我想这也可以很方便,如果你想打印头部(快速检查)控制台,但重定向主体到一个文件(例如,当它的某种二进制不混乱你的终端):

$ curl -sSD/dev/stderr http://localhost:1231 > /dev/null
HTTP/1.1 200 OK
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: application/json
Date: Wed, 29 Jul 2020 21:20:02 GMT

注意:这与curl -I <url>!As -I将执行HEAD请求而不是GET请求(在man curl中查找——HEAD。是:对于大多数HTTP服务器,这将产生相同的结果。但是我知道很多商业应用程序根本没有实现HEAD请求;-P

我可以通过查看curl文档来得到一个解决方案,该文档指定使用-来将输出输出到stdout。

curl -o - -I http://localhost

要用http返回代码获得响应,我可以这样做

curl -o /dev/null -s -w "%{http_code}\n" http://localhost

仅捕获响应: curl——location——请求GET“http://localhost:8000” 捕获响应和它的状态码: curl——location——request GET "http://localhost:8000" -w "%{http_code}" 在文件中捕获响应: curl——location——request GET "http://localhost:8000" -s -o "response.txt"

哇,这么多答案,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”参数,因为这是脚本中添加的内容

我使用这个命令打印状态代码,而不输出任何其他结果。此外,它将只执行HEAD请求并遵循重定向(分别为-I和-L)。

curl -o -I -L -s -w "%{http_code}" http://localhost

这使得检查运行状况脚本中的状态代码非常容易:

sh -c '[ $(curl -o -I -L -s -w "%{http_code}" http://localhost) -eq 200 ]'