curl
发出HTTP请求。将响应主体打印为标准输出,这很好,但是我无法从手册页中看到如何卷曲以从响应中打印HTTP状态代码(404、403等)。这可能吗?#1 楼
如果Web服务器能够响应HEAD请求(这不会执行GET
),则此方法应该对您有用:curl -I http://www.example.org
此外,让cURL跟随重定向(3xx个状态)添加-L。
评论
注意:curl-我执行HEAD HTTP请求,这对于测试某些Web应用程序服务器和服务的HTTP状态代码可能会出现问题
–杰伊·泰勒(Jay Taylor)
2012年9月6日17:32
并仅获取状态号,将其输送到head -n 1 | cut -d $''-f2
– Benubird
13年7月17日在11:33
不要忘记重定向curl的stderr:curl -I http://www.example.org 2> / dev / null |头-n 1 |切-d $''-f2。如果重定向后需要最终状态,请添加-L来卷曲。
–亚伦·布伦库什(Aaron Blenkush)
2014年7月24日在21:16
仅执行HEAD请求后执行重定向可能会导致有趣的行为,具体取决于应用程序的编程方式。
–斯科特·麦金太尔
15年9月21日在21:16
curl -I -X GET将发送GET请求,但给出相同的输出。
–吉吉
15年11月30日在19:20
#2 楼
仅输出HTTP状态代码的一种更具体的方法是:curl -s -o /dev/null -w "%{http_code}" http://www.example.org/
在脚本中使用起来要容易得多,因为它不会需要任何分析:-)
可以添加参数
-I
以提高响应负载性能。该参数仅请求响应的状态/标题,而无需下载响应正文。 注意:
%{http_code}
在HTTP有效负载的第一行返回即:
curl -s -o /dev/null -I -w "%{http_code}" http://www.example.org/
评论
-w“%{http_code}”是显示状态代码的位。您可以在其中添加一两个换行符以将代码与正文分开(-w“ \ n \ n%{http_code} \ n”)
–杰弗里·马丁内斯(Jeffrey Martinez)
2014年1月11日在8:33
哇,这个/ dev / null东西甚至可以在我使用的Windows版本的curl中使用。
– Uwe Keim
15年1月30日在6:53
我相信这会下载整个文件,即使它们都下载到/ dev / null,因此对于检查大型文件的状态代码也不理想。 httping -c 1 -s -G -m发出GET并不会下载整个文件,尽管我意识到这个问题专门与curl有关。
–RomanSt
15年12月13日在23:59
仅供参考:-s =不显示下载进度,-o / dev / null =不显示正文,-w“%{http_code}” =退出后将http响应代码写入stdout。
– Ajedi32
16年7月19日在16:59
是否需要在“%{http_code}”周围加上引号?
–哈坎巴巴
18年3月13日在18:52
#3 楼
除了执行所有标头之外,还可以执行以下操作来打印状态代码:curl -i http://example.org
关于
-i
的好处是它也可以与-X POST
一起使用。 br />评论
比接受的答案(执行HEAD请求)好得多。
– neu242
2014年10月2日,10:05
也许很明显,但是-i可以与任何HTTP方法一起使用,而不仅仅是GET和POST ... :)
–mac
14-10-20在10:35
最佳答案,因为它使curl同时输出标头和正文,使其适合在脚本中使用时的大多数任务
–显示名称
15年8月31日在19:52
这是最好的答案,可以与-s(不显示进度表或错误消息)和-S(毕竟显示错误消息)结合使用
–乔纳森·哈特利
17年2月23日在19:10
谢谢你很棒
–ennth
12月4日,11:24
#4 楼
如果要查看标题和结果,可以使用详细选项:curl -v http://www.example.org
curl --verbose http://www.example.org
状态将显示在标题中。例如
< Date: Tue, 04 Nov 2014 19:12:59 GMT
< Content-Type: application/json; charset=utf-8
< Status: 422 Unprocessable Entity
评论
用于指出详细标志的+1提供了更多详细信息。非常适合测试REST应用。
–MrOodles
2012年10月15日20:37
+1在执行POST请求时非常容易使用(curl -v --data“ ...”)
– MegaTux
2014年6月23日20:06在
甚至将它们分为两个不同的文件输出(http状态详细信息发送到stderr,响应正文发送到stdout)
– phil294
18年4月30日在7:37
#5 楼
如果要捕获变量中的HTTP状态代码,但仍将内容重定向到STDOUT,则必须创建两个STDOUT。您可以使用进程替换>()和命令替换$()来实现。首先,使用
3
为当前进程的STDOUT创建文件描述符exec 3>&1
。然后,使用curl的
-o
选项通过命令替换将响应内容重定向到临时fifo,然后在该命令替换中,将输出重定向回具有3
的当前进程STDOUT文件描述符-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在下面的注释中指出了。评论
那真是太脏了……我喜欢!
–间谍
15年1月30日在21:14
现在如何依次将输出重定向到另一个变量?
–罗杰·菲耶尔(Roger Filmyer)
15年3月12日在1:46
输出在STDOUT中,因此您应该能够将命令的输出重定向到任意位置,就像常规命令一样。我还没有测试过。
–希思边界
2015年7月21日,3:10
不适用于/ bin / sh。
– SamK
18-10-11在14:47
很好的答案,如果您希望shell的可移植性,您也可以重定向到真实文件并在以后保存它
–akostadinov
19-2-8在9:40
#6 楼
重新定义curl输出:curl -sw '%{http_code}' http://example.org
可以与任何请求类型一起使用。
评论
-k(-不安全)将覆盖-s(静默)。
–拉维尚德拉
18年7月10日在11:33
#7 楼
状态码仅[0]$ curl -LI http://www.example.org -o /dev/null -w '%{http_code}\n' -s
[0]$ 200
此GIST的所有功劳
#8 楼
这是一个痛苦的curl --fail
限制。来自man curl
:-f,--fail
(HTTP)在服务器错误时静默失败(根本没有输出)
但是没有办法在stdout中同时获取非零返回码和响应主体。
基于pvandenberk的回答以及在SO上学到的另一个非常有用的技巧,这是一种解决方法:
curl_with_error_code () {
_curl_with_error_code "$@" | sed '$d'
}
_curl_with_error_code () {
local curl_error_code http_code
exec 17>&1
http_code=$(curl --write-out '\n%{http_code}\n' "$@" | tee /dev/fd/17 | tail -n 1)
curl_error_code=$?
exec 17>&-
if [ $curl_error_code -ne 0 ]; then
return $curl_error_code
fi
if [ $http_code -ge 400 ] && [ $http_code -lt 600 ]; then
echo "HTTP $http_code" >&2
return 127
fi
}
此函数的行为与
curl
完全相同,但如果HTTP代码在[400,600]范围内,则将返回127(curl
未使用的返回码)。 [。评论
同意,无法看到错误输出是非常方便的--fail的痛苦限制。如何在不看到错误输出的情况下诊断REST api故障?不幸的是,卷发维护者装袋机顽固地坚持不提供--fail-but-show-error。 github.com/curl/curl/issues/1978
–贾姆希德
18年5月13日在23:33
如文档中所述,它不适用于401和407 HTTP代码:(
– Logan Mzz
19年8月29日在8:47
多亏了一位同事,我才发现--fail --show-error
–卢卡斯·西蒙(Lucas Cimon)
4月28日13:11
#9 楼
这将向url发送一个请求,仅获取响应的第一行,将其拆分为块,然后选择第二行。它包含响应代码
curl -I http://example.org 2>/dev/null | head -n 1 | cut -d$' ' -f2
评论
您能否解释一下此代码的作用以及它如何解决OP给出的问题?无法解释的代码对用户而言似乎是不可信任的,并且很危险。
–bwDraco
15年7月16日在1:58
当然,我们向url发送一个请求,仅获得响应的第一行,将其拆分为块,然后选择第二行。它包含OP寻找的响应代码。
–Filip Spiridonov
15年7月20日在22:01
#10 楼
对于POST请求,以下工作有效:curl -w 'RESP_CODE:%{response_code}' -s -X POST --data '{"asda":"asd"}' http://example.com --header "Content-Type:application/json"|grep -o 'RESP_CODE:[1-4][0-9][0-9]'
#11 楼
使用以下cURL命令并将其通过管道传递给grep,如下所示:$ curl -I -s -L http://example.com/v3/get_list | grep“ HTTP / 1.1”
每个标志的作用是:
-I
:仅显示响应标头-s
:静音-不显示进度栏-L
:跟随Location:
标头这里是HTTP状态代码的链接。
从命令行运行。该curl在静默模式下运行,跟随所有重定向,获取HTTP标头。 grep会将HTTP状态代码输出到标准输出。
#12 楼
这是一些使用GET
的curl命令,该命令会返回HTTP代码。curl -so /dev/null -w '%{response_code}' http://www.example.org
请记住,下面的方法使用
HEAD
,该方法速度更快,但可能不会与某些不兼容Web的HTTP服务器配合使用。 curl -I http://www.example.org
评论
至少在OS X上不起作用。
– Ain
16年7月27日在14:01
在OS X High Sierra 10.13.6上对我来说工作正常。
–本·男爵
18年7月27日在16:39
#13 楼
curl -so -i /dev/null -w "%{http_code}" http://www.any_example.com
这将返回以下信息:
响应数据,如果API返回了任何数据,例如错误
状态代码
评论
这不跟随重定向。这个现有的答案是更好的superuser.com/a/442395/475508
– OneCricketeer
17年4月10日在18:16
当然,您也可以参考!!
–斯拉那
17年12月12日下午16:40
#14 楼
有关如何使用响应代码的示例。仅当它们已更改(-z
)并遵循重定向(-L
)后,我才用它重新下载Geolite数据库:url=http://example.com/file.gz
file=$(basename $url)
response=$(curl -L -s -o $file -z $file $url -w "%{http_code}")
case "$response" in
200) do_something ;;
301) do_something ;;
304) printf "Received: HTTP $response (file unchanged) ==> $url\n" ;;
404) printf "Received: HTTP $response (file not found) ==> $url\n" ;;
*) printf "Received: HTTP $response ==> $url\n" ;;
esac
#15 楼
将输出内容拆分为stdout
,将HTTP状态代码拆分为stderr
:curl http://www.example.org -o >(cat >&1) -w "%{http_code}\n" 1>&2
如果仅HTTP状态代码需要stderr,则可以使用
--silent
:curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}\n" 1>&2
然后可以通过将不需要的流重定向到
/dev/null
来选择所需的流:$ (curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}" 1>&2) 1>/dev/null
200
$ (curl --silent http://www.example.org -o >(cat >&1) -w "%{http_code}" 1>&2) 2>/dev/null
<!doctype html>
...
请注意,第二种重定向的行为根据需要,我们需要在subshell中运行curl命令。
评论
需要bash才能进行进程替换。
– Jaakko
19年4月4日在8:16
@Bruno,我从superuser.com/revisions/1444693/2更改了示例,因为我认为/ tmp / out / tmp / err文件如果并行运行会导致意外结果。
– Jaakko
19-10-8在8:13
#16 楼
OP希望知道状态码。通常,在下载文件时,您还想了解它的大小,因此我首先使用curl来显示状态代码和文件大小,然后关闭详细信息并将文件直接指向我想要的位置和名称:curl -R -s -S -w "\nhttp: %{http_code} %{size_download}\n" -o /Users/myfiles/the_local_name.html http://archive.onweb.com/the_online_name.html
然后我等待卷曲的完成
wait ${!}
,然后再运行下一个命令。上面的代码在类似上述许多命令的脚本中使用时,给出了很好的响应,例如:
http:200 42824
http:200 34728
http:200 35452
请注意,curl中的-o后面必须是文件的完整路径+文件名。这样,当您使用curl进行d / l压缩时,便可以将文件保存为合理的名称结构。还要注意,-s和-S一起使输出静音,但确实显示错误。另请注意,-R尝试将文件时间戳设置为Web文件的时间戳。 / null。
评论
对于我来说,我可以从手册中了解如何获取HTTP状态代码,但是选项-w不起作用。我已将该错误报告给Apple。就像curl -i https://www.example.com/中的-i标志一样,可能是您想要的,根据superuser.com/a/514798/190188
为什么不只像curl -IL这样的东西http://www.example.com | grep“ ^ HTTP \ /”?
不要对未来的自我:您想要的答案可能是西里尔·大卫(目前在第4位)