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

curl -I http://localhost

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

curl http://localhost

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


当前回答

这是一种检索body“AND”状态代码并将其格式化为适当的json或任何适合您的格式的方法。有些人可能会认为这是写格式选项的不正确使用,但这对我来说是有效的,当我需要在我的脚本中的主体和状态代码来检查状态代码并从服务器中继回响应。

curl -X GET -w "%{stderr}{\"status\": \"%{http_code}\", \"body\":\"%{stdout}\"}"  -s -o - “https://github.com” 2>&1

运行上面的代码,你应该得到一个json格式:

{
"status" : <status code>,
"body" : <body of response>
}

使用-w write format选项,因为stderr是先打印的,你可以用var http_code格式化你的输出,并将响应的主体放在一个值(body)中,然后使用var stdout跟随封闭。然后将stderr输出重定向到stdout,您将能够将http_code和响应体结合到一个整洁的输出中

其他回答

这个命令

 curl http://localhost -w ", %{http_code}"

将得到以逗号分隔的正文和状态;你可以把它们分开取出来。

您可以随心所欲地更改分隔符。

我的方法是:

为了获得两者(标题和正文),我通常执行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

一个清晰的使用管道读取

function cg(){
    curl -I --silent www.google.com | head -n 1 | awk -F' ' '{print $2}'
}
cg
# 200

欢迎在这里使用我的dotfile脚本

解释

——silent:使用管道时不显示进度条 head -n 1:只显示第一行 -F' ':使用分隔符分隔文本 '{print $2}':显示第二列

对于编程使用,我使用以下代码:

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