我在Linux的命令行上使用curl发出HTTP请求。将响应主体打印为标准输出,这很好,但是我无法从手册页中看到如何卷曲以从响应中打印HTTP状态代码(404、403等)。这可能吗?

评论

对于我来说,我可以从手册中了解如何获取HTTP状态代码,但是选项-w不起作用。我已将该错误报告给Apple。

就像curl -i https://www.example.com/中的-i标志一样,可能是您想要的,根据superuser.com/a/514798/190188

为什么不只像curl -IL这样的东西http://www.example.com | grep“ ^ HTTP \ /”?

不要对未来的自我:您想要的答案可能是西里尔·大卫(目前在第4位)

#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)-releasemacOS的标准)中:

# 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>
...


请注意,第二种重定向的行为根据需要,我们需要在subshel​​l中运行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。