CURL使用
描述
curl
是一个用于向服务器发送数据,从服务器获取数据的工具,它支持例如HTTP
,HTTPS
,FTP
,SCP
等协议,它是我们开发和运维过程中的一个常用工具,在此记录它的使用方法以及常用的选项。
使用
简单使用
获取百度首页
curl http://www.baidu.com
指定请求方法
-X, --request
-X, --request <command>
在使用HTTP
协议时,可以使用此选项自定义请求方法而不是使用其他请求方法,默认的请求方法是GET
。
curl -X POST http://www.baidu.com
-G, --get
-G, --get
当使用此选项时,会将使用-d
,--data
,---data-binary
,--data-urlencode
参数的请求的POST
方法改为使用GET
方法。数据将会被添加到url,并且使用?
号作为分割符。
curl -s -o /dev/null -v -G -d 'name=12&age=9p=12' http://www.baidu.com
-I, --head
-I, --head
通过使用HEAD
方法获取请求响应头,并将其打印出来。
curl -I http://www.baidu.com
发送请求数据
-d, --data
-d, --data <data>
将给定的数据以POST
请求的方式发送给服务器,就像用户在浏览器里面提交表单一样。curl
会使用Content-Type : application/x-www-form-urlencoded
请求头向服务器发送请求。如果在同一个命令行使用了多次这个选项,那么数据将会被合并,并且使用&
符号作为分割,因此使用-d name=daniel -d skill=lousy
将会生成像是name=daniel&skill=lousy
这样。如果数据以@
开头,那么剩余的部分应当是待读取数据的文件的名称;如果是-
符,那么就将会从标准输入中读取数据。如果想要通过一个叫做foobar的文件中读取数据并将其post到服务器,那么这样写即可-d @foobar
。使用curl -d @-<<EOF http://www.baidu.com
将会从命令行读取输入的数据并将其发送到服务器,输入EOF并按下回车符作为输入结束的标志。当从文件中读取数据时,他会去掉回车符和换行符。
curl -d q=ok -d p=23 http://www.baidu.com
curl -d 'login=emma&password=123' -X POST https://google.com/login
--data-urlencode
--data-urlencode
像-d, --data
选项一样向服务器post数据,但是他会向对数据执行URL-encoding
编码。
curl --data-urlencode 'comment=hello world' -d 'name=12&age=9p=12' http://www.baidu.com
--data-binary
--data-binary <data>
以纯二进制的方式传递数据,并不会对数据进行任何额外的处理。传递数据的content-type
头同样也是application/x-www-form-urlencoded
。
--data-raw
--data-raw <data>
像-d, --data
选项一样向服务器post数据,但是它不会对@
符号进行特殊解释。
-F, --form
-F, --form <name=content>
使用此选项,curl
模拟用户点击提交按钮提交一个填写了数据的表单,它会使用Content-Type:multipart/form-data
去提交数据。
强制内容作为一个文件上传,那么文件名带上@
符号作为前缀即可;如果仅仅从文件中读取表单数据的话,那么文件名带上<
符号作为前缀即可。@
和<
符号的区别在于@
让文件在POST中作为表单的文件上传字段的附件,而<
是从文件中读取数据,并且将其作为文本字段的内容。
可以使用-
替代文件名来告诉curl
从标准输入中读取内容而不是从文件中读取内容。同样也有@
和<
两种构造。当使用标准输入时,内容首先会被缓存到内存中,由curl
决定缓冲的大小以及将其重新发送。定义part数据时,如果数据来自于命名的非常规文件,例如命名的管道或者其他,那么它将不受缓存的影响,并且将会在传输的时候有效地读取。因为在传输开始之前文件的大小是未知的,那么数据将会由HTTP以块的形式传输,IMAP协议则会拒绝。
例如上传一个图片文件到服务器,以profile作为待上传文件portrait.jpg的表单字段的名称。
curl -F profile=@portrait.jpg https://example.com/upload.cgi
例如将name
和shoezise
作为两个文本字段发送到服务器。
curl -F name=John -F shoesize=11 https://example.com/
例如以story
作为纯文本字段,并且从本地文件中读取数据作为它的内容。
curl -F "story=<hugefile.txt" https://example.com/
也可以使用type=
告诉curl
使用哪一种Content-Type
。
curl -F "web=@index.html;type=text/html" example.com
curl -F "name=daniel;type=text/foo" example.com
可以使用filename=
显示地指定文件上传到服务器时的名称。
curl -F "file=@localfile;filename=nameinpost" example.com
如果文件名或者路径包含有,
或者;
那么他必须被双引号引起来。
curl -F "file=@"localfile";filename="nameinpost"" example.com
或者
curl -F 'file=@"localfile";filename="nameinpost"' example.com
注意,如果文件或者路径由双引号引起来,那么文件名里面的双引号或者反斜线必须要由反斜线进行转义。
如果非文件数据包含有分号;
,前导空格,以空格结尾或者由双引号引起来,那么它也必应使用引号引起来。
curl -F 'colors="red; green; blue";type=text/x-myapp' example.com
可以使用headers=
自定义请求头。
curl -F "submit=OK;headers="X-submit-type: OK"" example.com
或者
curl -F "submit=OK;headers=@headerfile" example.com
当header从文件中读取数据时,空行和以#
号开头的行将会被忽略。可以通过在两个字之间拆分并以空格开始连续行来折叠;嵌入的回车和尾随空格将被忽略( each header can be folded by splitting between two words and starting the continuation line with a space; embedded carriage-returns and trailing spaces are stripped)。
# This file contain two headers.
X-header-1: this is a header
# The following header is folded.
X-header-2: this is
another header
设置请求头
-H, --header
-H, --header <header/@file>
设置http请求的请求头。如果自定义的某一个请求头和curl内部的请求头名字一样,那么外部设置的请求头将会覆盖内部的请求头。使用一个冒号右边不带任何值的外部请求头覆盖内部请求头就可以移除内部请求头,例如-H "Host:"
。如果想要发送一个不带任何值的请求头,那么它必须以分号结尾,例如 -H "X-Custom-Header;"
将会发送一个X-Custom-Header:
请求头。curl
将会确保添加或者替换的每一个请求头带有恰当的行结束标记,所以不必为其添加回车符或者换行符。
curl -H "X-First-Name: Joe" http://example.com/
-A, --user-agent
-A, --user-agent <name>
为HTTP请求设置指定User-Agent
请求头,如果这个选项被使用多次,那么最后一次将会起作用。
curl -A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' http://www.baidu.com
-e, --referer
-e, --referer <URL>
为HTTP请求设置指定的Referer
请求头。当使用-L, --location
参数时,可以为-e, --referer <URL>
添加;auto
,这样curl将会在重定向时自动设置前一个请求的url。;auto
可以单独使用,即使你不设置初始的-e, --referer.
。
处理cookie
-b, --cookie
-b, --cookie <data|filename>
为HTTP请求设置指定的Cookie
请求头。他假定数据是前一个请求从服务器的Set-Cookie:
行获取到的。数据格式应当是NAME1=VALUE1; NAME2=VALUE2
。
如果给的参数里面没有=
号,那么它将其作为文件名并从其读取cookie数据。当使用这个选项时,会激活curl的cookie引擎,curl会记录返回的cookie,这对于使用-L, --location
选项或者在同一个调用里面做多个请求。如果文件名字是-
那么将会从标准输入中读取数据。
读取cookie的文件的格式必须要是纯HTTP请求头(Set-Cookie风格)或者 Netscape/Mozilla的cookie文件格式。-b, --cookie
指定的文件仅仅作为输入,cookie不会被写入文件。
如果这个选项被使用多次,那么只有最后一个生效。
curl -b 'foo=bar' http://www.baidu.com
-c, --cookie-jar
-c, --cookie-jar <filename>
再操作完成后,将所有的cookie写入此文件。如果没有cookie将不会向文件中写入数据。写cookie数据会使用Netscape cookie文件格式。如果文件名字是-
那么cookie将会被写入标准输出。如果cookie文件不能被创建或者写入,那么curl操作不会失败,甚至不会报一个清晰的错误。如果这个选项被使用多次,那么只有最后一个生效。
curl -c cookies.txt http://www.baidu.com
下载保存文件
-o, --output
-O, --remote-name
将返回内容写入到文件而不是写入到标准输出。
curl -o example.html https://www.example.com
-O, --remote-name
-O, --remote-name
将返回内容写入到本地文件,并且已远端文件的名称对其命名。
curl -O https://www.example.com/foo/bar.html
打印请求过程
-v, --verbose
-v, --verbose
将curl操作的内容打印出来。其中>
表示发送的请求头数据,<
表示接收的请求头数据,以*
开头的行是curl提供的额外信息。
curl -v https://www.example.com
--trace
--trace
会将所有的输入数据和输出数据写入给定的文件,如果这个选项出现多次,那么最后一个生效。使用-
作为文件名那么会把内容输出到标准输出;使用%
作为文件名那么会把内容输出到标准错误。
-i, --include
-i, --include
输出响应内容以及HTTP响应头。
curl -i https://www.example.com
-S, --show-error
-S, --show-error
如果发生错误,就会把错误信息打印出来。
curl -S http://www.baidu.com44
-s, --silent
-s, --silent
不会输出错误信息,但是仍然会请求的数据输出出来,默认是输出到终端或者标准输出,除非被重定向。
设置代理
-x, --proxy
-x, --proxy [protocol://]host[:port]
设置代理,如果不指定代理协议或者代理协议是http://
,那么将其视为HTTP代理。如果代理端口不指定,那么默认为1080。
curl -x http://192.168.58.1:8888 http://www.baidu.com
处理重定向
-L, --location
-L, --location
使用此选项时,如果服务器响应的是重定向,即HTTP响应头是3XXX,那么curl将会重新请求重定向的地址,即HTTP响应头的Location。
curl -L -d 'tweet=hi' https://api.twitter.com/tweet
HHTPS
-k, --insecure
-k, --insecure
curl处理每一个SSL连接默认都会进行验证以确保其安全性。这个选项命令在即使认为连接不安全时也会继续处理连接,即不会进行SSL证书校验。
curl -k https://www.example.com