我curl
在 Linux 上使用命令行发出 HTTP 请求。响应主体打印到标准输出,这很好,但我无法从手册页中看到如何让 curl 从响应中打印 HTTP 状态代码(404、403 等)。这可能吗?
答案1
这应该对你有用如果Web 服务器能够响应 HEAD 请求(这不会执行请求GET
):
curl -I http://www.example.org
另外,为了让 cURL 遵循重定向(3xx 状态),请添加-L
。
答案2
更具体的打印方法只是HTTP 状态代码大致如下:
curl -s -o /dev/null -w "%{http_code}" http://www.example.org/
在脚本中使用起来更容易,因为它不需要任何解析:-)
可以添加该参数-I
来提高响应加载性能。这会将调用更改为HEAD
仅获取响应开销而不获取主体的调用。
笔记: %{http_code}
返回 HTTP 有效负载的第一行(文档页面-w
上该选项的可用变量curl
)
IE:
curl -s -o /dev/null -I -w "%{http_code}" http://www.example.org/
答案3
除了所有标题之外,您还可以通过执行以下操作来打印状态代码:
curl -i http://example.org
其优点在于它也能很好地-i
工作。-X POST
答案4
如果要将 HTTP 状态代码捕获到变量中,但仍将内容重定向到 STDOUT,则必须创建两个 STDOUT。您可以使用进程替换 >()和命令替换 $()。
3
首先,使用 为当前进程的 STDOUT创建一个文件描述符exec 3>&1
。
然后,使用 curl 的-o
选项通过命令替换将响应内容重定向到临时 fifo,然后在该命令替换内,使用 将输出重定向回当前进程 STDOUT3
文件描述符-o >(cat >&3)
。
把所有内容放在一起bash
3.2.57(1)-release
(标准macOS
):
# creates a new file descriptor 3 that redirects to 1 (STDOUT)
exec 3>&1
# Run curl in a separate command, capturing output of -w "%{http_code}" into HTTP_STATUS
# and sending the content to this command's STDOUT with -o >(cat >&3)
HTTP_STATUS=$(curl -w "%{http_code}" -o >(cat >&3) 'http://example.com')
/bin/sh
请注意,这在以下情况下不起作用:SamK 在下面的评论中指出。