curl是一个命令行工具,通过指定的URL来上传或下载数据,并将数据展示出来。curl中的c
表示client,而URL,就是URL。这里我们介绍一下curl的使用。
1、查看url访问详细信息
$ curl -v www.baidu.com -o baidu
得到如下信息:
* About to connect() to www.baidu.com port 80 (#0)
* Trying 180.101.49.12... connected
* Connected to www.baidu.com (180.101.49.12) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.16.2.3 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2
> Host: www.baidu.com
> Accept: */*
>
< HTTP/1.1 200 OK
< Accept-Ranges: bytes
< Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
< Connection: Keep-Alive
< Content-Length: 2381
< Content-Type: text/html
< Date: Fri, 08 Nov 2019 05:53:25 GMT
< Etag: "588604c8-94d"
< Last-Modified: Mon, 23 Jan 2017 13:27:36 GMT
< Pragma: no-cache
< Server: bfe/1.0.8.18
< Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
<
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>鐧惧害涓€涓嬶紝浣犲氨鐭ラ亾</title></head> <body link=#0000cc> <div id=wrapper> <div id=head> <div class=head_wrapper> <div class=s_form> <div class=s_form_wrapper> <div id=lg> <img hidefocus=true src=//www.baidu.com/img/bd_logo1.png width=270 height=129> </div> <form id=form name=f action=//www.baidu.com/s class=fm> <input type=hidden name=bdorz_come value=1> <input type=hidden name=ie value=utf-8> <input type=hidden name=f value=8> <input type=hidden name=rsv_bp value=1> <input type=hidden name=rsv_idx value=1> <input type=hidden name=tn value=baidu><span class="bg s_ipt_wr"><input id=kw name=wd class=s_ipt value maxlength=255 autocomplete=off autofocus></span><span class="bg s_btn_wr"><input type=submit id=su value=鐧惧害涓€涓?class="bg s_btn"></span> </form> </div> </div> <div id=u1> <a href=http://news.baidu.com name=tj_trnews class=mnav>鏂伴椈</a> <a href=http://www.hao123.com name=tj_trhao123 class=mnav>hao123</a> <a href=http://map.baidu.com name=tj_trmap class=mnav>鍦板浘</a> <a href=http://v.baidu.com name=tj_trvideo class=mnav>瑙嗛</a> <a href=http://tieba.baidu.com name=tj_trtieba class=mnav>璐村惂</a> <noscript> <a href=http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2f%3fbdorz_come%3d1 name=tj_login class=lb>鐧诲綍</a> </noscript> <script>document.write('<a href="http://www.baidu.com/bdorz/login.gif?login&tpl=mn&u='+ encodeURIComponent(window.location.href+ (window.location.search === "" ? "?" : "&")+ "bdorz_come=1")+ '" name="tj_login" class="lb">鐧诲綍</a>');</script> <a href=//www.baidu.com/more/ name=tj_briicon class=bri style="display: block;">鏇村浜у搧</a> </div> </div> </div> <div id=ftCon> <div id=ftConw> <p id=lh> <a href=http://home.baidu.com>鍏充簬鐧惧害</a> <a href=http://ir.baidu.com>About Baidu</a> </p> <p id=cp>©2017 Baidu <a href=http://www.baidu.com/duty/>浣跨敤鐧惧害鍓嶅繀璇?/a> <a href=http://jianyi.baidu.com/ class=cp-feedback>鎰忚鍙嶉</a> 浜琁CP璇?30173鍙?nbsp; <img src=//www.baidu.com/img/gs.gif> </p> </div> </div> </div> </body> </html>
* Connection #0 to host www.baidu.com left intact
* Closing connection #0
如果觉得使用-v
的信息还不够的话,还可以使用--trace [filename]
选项来讲完整的流保存到filename
中。比如:
$ curl --trace dump www.baidu.com
verbose模式的对立模式,就是silence,可以使用-s
或--silence
选项来告诉curl不输出任何程序的信息或者错误信息,但也会输出响应的结果。
如果需要在有错误的时候输出错误信息,可以使用-S
或--show-error
来指定。
2. 浏览器到curl
别人使用浏览器发起了一个请求之后,如果自己想用curl再来一次同样的请求,这里日常的工作中是比较常见的一个操作。在curl中,有没有什么比较简便快捷的方式来获得curl命令呢?
Chrome浏览器和Firefox浏览器都实现了复制成curl的工具,可以将浏览器的请求快速复制成curl命令,非常方便快捷。
1. Chrome
在Chrome中,打开More tools->Developer模式,选择Network选项卡,然后就可以看到所有的请求,选中相应的请求,右键就有Copy as cURL
选项,单击就可以了。
2. Firefox
在Firefox中,打开Web Developer->Network工具,然后右键想要复制的链接,就有一个Copy as cURL
的选项,单击就可以了。
3. HTTP与curl
与curl一起使用的协议,最多的还是HTTP,这里就将介绍如何有效地使用curl来发送HTTP请求。
3.1 HTTP方法
在每一个HTTP请求中,都有一个对应的方法,常用的方法有:GET
、POST
、HEAD
和PUT
。
如果在一个curl命令中不指定具体的方法,那么默认的就是使用GET
方法。对于其它的方法,可以在curl命令中指定:
method | option |
---|---|
POST | -d 或-F |
HEAD | -I |
PUT | -T |
3.2 Header
在curl中,使用-i
选项可以显示Response的Header信息,连同Body数据:
$ curl -i www.baidu.com
结果:
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: Keep-Alive
Content-Length: 2381
Content-Type: text/html
Date: Mon, 17 Sep 2018 10:26:42 GMT
Etag: "588604dd-94d"
Last-Modified: Mon, 23 Jan 2017 13:27:57 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
<!DOCTYPE html>
<!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta
http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=styleshee
t type=text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就
知道</title></head> <body link=#0000cc> ... </body> </html>
使用-I
选项可以只显示Response的Header信息:
$ curl -I www.baidu.com
3.3 POST
POST
是HTTP中向服务端提交数据的一种方法。在浏览器中,但在表单中填写完数据后,浏览器就会默认将填写的数据使用key=value
串的形式进行转化。在curl中,我们可以使用-d
或--data
选项来指定具体的数据:
$ curl -d key1=value1&key2=value2 http://example.com
我们也可以使用多个-d
选项来指定多组数据,curl会自动把这些数据连接起来,因此上面的例子还可以这样:
$ curl -d key1=value1 -d key2=value2 http://example.com
当然,如果数据过多,我们还可以把数据放在一个文件中:
$ curl -d @filename http://example.com
1. Content-Type
当使用POST
方法提交数据时,对于提交的数据主要有如下四种形式:
application/x-www-form-urlencoded
:默认的形式,即key1=value1&key2=value2
的形式;multipart/form-data
:使用表单上传文件时使用这个形式;application/json
:提交JSON格式的数据;text/xml
:提交XML格式的数据。
Content-Type是一个Header,如果不指定的话,那么默认就是使用application/x-www-form-urlencoded
形式传输数据,当需要使用别的形式进行数据传输的话,那么就需要指定这个Header:
$ curl -d '{I Am A JSON FORM}' -H 'Content-Type: application/json' http://example.com
其中,-H
就是用来指定一个具体的Header的选项,值就是key=value
的形式。当需要指定其它的Header,可以使用-H
选项。
2. POST一个二进制数据
在curl中,我们也可以提交一个文件,可以使用--data-binary
选项来指定一个文件:
$ curl --data-binary @filename http://example.com
3. 转化成一个GET
使用-G
或-get
选项,可以把一个POST请求转化成一个GET请求。如果有-d
选项指定的参数,那么curl就会把-d
后面的数据添加到URL的后面,用?
连接。比如:
$ curl -d "key1=value1" -G http://example.com
得到的请求URL就是:
http://example.com/?key1=value1
4. URL编码
如果使用的数据没有编码,那么可以指定curl来帮助自己进行编码。这时可以使用--data-urlencode
选项来指定。比如:
$ curl --data-urlencode "name=Alan Walker" http://example.com
5. multipart formposts
如果一个HTTP POST具有如下形式的表单:
<form action="submit.cgi" method="post" enctype="multipart/form-data">
Name: <input type="text" name="person"><br>
File: <input type="file" name="secret"><br>
<input type="submit" value="Submit">
</form>
用户可以在Name
中填写名字,在File
中选择一个文件,然后单击Submit
按钮提交数据。
为了可以在curl中模拟这个请求,我们可以使用-F
或--form
选项来指定数据:
$ curl -F person=annonymous -F secret=@filename http://example.com/submit.cgi
在上面的表单中,action
指定了这个请求发送到哪里;method
指定这是一个POST
请求;而enctype
指定了这是一个multipart formpost。
当执行上面的curl命令后,curl会产生如下的请求头:
POST /submit.cgi HTTP/1.1
Host: example.com
User-Agent: curl/7.46.0
Accept: */*
Content-Length: 313
Content-Type: multipart/form-data; boundary=------------------------d74496d66958873e
其中Content-Type
是和enctype
一致的。
当使用-F
选项时,默认的Content-Type
就是multipart/form-data
,不过,我们也可以使用-H
进行指定:
$ curl -F 'name=Dan' -H 'Content-Type: multipart/magic' https://example.com
6. -d
vs -F
在前面我们介绍了使用-d
构造一个基本的POST请求,和-F
构造一个multipart formpost请求。那么这两个选项有啥区别以及什么时候使用呢?
这两个选项都是把指定的数据发送到服务器上,区别在于数据传递的格式。大多数时候,接收端来指定希望客户端发送数据的格式,客户端不能随意自己指定格式。
- HTML表单
当使用HTML表单时,会使用<form>
标签指定一个表单,这会让浏览器使用POST
方法。如果标签中含有enctype=multipart/form-data
,这意味着使用multipart formpost方式,在curl中就是使用-F
选项。一个典型的场景就是表单中含有<input type=file>
标签。
- 不用HTML表单
POST
方法不一定非要在HTML中,在好多的service、APIs中,也可以使用POST
请求。
如果这些service期望使用JSON或者其它类似的格式的数据,那么这就是一个普通的POST请求。在curl中就可以使用-d
选项。不过要注意-d
的默认Content-Type是不是期望的格式,如果不是的话,可以使用-H
进行更改。
3.4 HTTP重定向(redirect)
重定向是HTTP协议中的一个基础部分。在重定向中,服务器给客户端的并不是客户端想要的内容,而是一个车具体的指令,告诉客户端如果想获取想要的数据,应该到哪里去请求。
但不是所有的重定向都一样。重定向之后的请求使用什么方法呢?重定向多久呢?
所有的重定向都会返回Location:
的Header,来指定一个新的URL。
1. curl:redirect
在curl中,默认不会重定向,可以使用-L
或--location
选项来告诉curl重定向:
$ curl -L http://example.com
2. GET
还是POST
第一次请求后,服务器会告诉客户端下一次请求需要使用的方法。关于重定向的响应码如下:
Method | Permanent | Temporary |
---|---|---|
切换到GET | 301 | 302和303 |
使用第一次请求的方法 | 308 | 307 |
我们可以指定curl在重定向时使用什么方法。如果我们第一次请求使用的不是GET
方法,重定向后也不希望curl默认使用GET
方法,那么我们可以使用--post301
,--post302
和--post303
选项来指定。
3.5 修改HTTP请求
每一个请求都有一个请求行、一些请求头和可选的请求体,这里我们看看在curl中可以具体修改的部分,包括请求行和请求头。
1. 请求方法
在请求行中包含这次请求所使用的方法。我们使用下面的简单命令就可以进行一个GET
方法:
$ curl http://example.com/file
这会生成如下的请求行:
GET /file HTTP/1.1
在HTTP方法中我们可以通过具体的选项指定使用什么方法。这里我们也可以使用-X
选项来进行指定:
$ curl -X POST http://example.com
2. 修改请求头
在curl中,我们可以使用-H
或--header
选项来指定Header。之前我们就使用-H
指定了Content-Type
,其实Header就是一个key: value
对:
$ curl -H "HeaderName: HeaderValue" http://example.com
3. Referer
我们还可以在curl通过--referer
选项来指定我们是从哪里跳转过来的:
$ curl --referer http://fromexample.com http://toexample.com
4. User Agent
这个字段是用来表示客户端的设备信息的,服务器会根据这个字段,针对不同的设备,返回不同格式的网页。在curl中,可以使用--user-agent
选的来指定:
$ curl --user-agent "[User Agent]" http://example.com
3.6 Cookies
HTTP是一种无状态的协议,为了在会话中保存一些状态,可以使用Cookies。服务器通过Set-Cookie:
来设置Cookie,客户端就可以在下一次请求中携带这些数据。
1. 设置Cookie
我们可以使用--cookie
选项来设置一个Cookie:
$ curl --cookie "CookieName=CookieValue" http://example.com
2. 从文件中读取Cookies
curl默认不会记住服务器设置的Cookie,也不会在下一次请求中携带Cookie。除非用户通过选项自己设置。
我们可以把之前的Cookies保存到一个文件,然后在下一次请求中指定curl读取文件中的Cookies:
$ curl -b cookies.txt http://example.com
-b
选项指定curl去给定的文件中读取Cookies。
不过要主要,这里仅仅是读取Cookies,如果这次请求中服务器修改了Cookie,那么curl是不会进行保存的,除非我们手动指定。
3. 写Cookies到文件
我们可以使用-c
选项指定curl保存这次请求中服务器设置的Cookies:
$ curl -c cookie.jar.txt http://example.com
有时,我们既需要从文件中读取Cookies,也需要保存服务器设置的Cookies。那么就可以同时使用-b
和-c
选项:
—————————————————————————————————
作者:今天中午吃啥
链接:https://www.jianshu.com/p/fc0eb6c60816
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。