1.什么是 curl
curl 官方的说法是一种用来在客户端和服务器之间做数据传输的命令行。简单的说,你可以用下面这个命令,将百度首页的内容下载下来:1
2
3
4
5$ curl http://baidu.com
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.com/">
</html>
以上就是下载的内容,如果你懂html的话,可以发现,百度的首页会自动跳转到 www.baidu.com 这个新地址。
如果很不幸你需要代理才能上网(比如在公司内网的时候),那你只需要稍微改改这个命令:1
$ curl -x http://proxy.com http://baidu.com
-x 表示启用代理,后面跟的自然就是代理的地址。
如果你想把内容下载成一个文件,也可以:1
$ curl -x http://proxy.com -o baidu.html http://baidu.com
-o 表示输出下载内容到一个文件,后面跟的自然就是文件名了。成功执行命令,目录中就会出现这个baidu.html
前面所说的都是从网上下载东西,看起来好像没什么用。是啊,有浏览器,我没还用这个干嘛呢?
可是有一些东西,浏览器是没法做到的。
比如,你需要访问一个开源api,你必须传递一些http header,这个时候,浏览器就没办法了。这还只是get请求,如果是post,put呢?
再比如,你需要要测试一些api,需要上传json数据,或者文件,这个时候,即使是postman,也无法又快又好的完成任务。
如果你了解curl,然后你可以预先写一些脚本,方便自己的同时,也可以分享给其他人?何乐而不为呢?
2. 更多用法
灵活的header
可以随意的指定header ,一个
1
$ curl -H "name:Joyce"
或者多个
1
$ curl -H "name:Joyce" -H "age:100"
或者引用本地文件内容,比如token
1
$curl -H "Authorization:${cat token.txt}"
随意指定http method
如果你不指定,默认就是GET。
这是POST
1
$ curl -XPOST
-X表示指定method
发送数据
可以将数据post或者put到远端。
1
$ curl -XPUT http://des.com -d xxx
-d 后面就是你想要put到http://des.com的数据,需要注意的是,对于一些数据,可能需要预先指定传输格式:
比如,对于图片,用 –data-binary,表示传输二进制数据。1
$ curl -XPUT http://des.com --data-binary @icon.jpg
这里的 @ 表示从指定文件中获取数据。
对于json数据,除了指定 content-type之外,还要注意一下json格式。
1
$ curl -XPOST -H "Content-Type: application/json" http://des.com -d '{"name":"silentsong"}'
上面json中的key和value都必须用双引号包装起来,整个json数据必须包含在单引号之中。
form 支持
curl支持上传一个form表单。比如最常见的登录表单
1
$ curl -XPUT -F name=slientsong -F password=123 http://dmoneh.github.io/silentsong/login
有时候,表单中会有上传文件
1
$ curl -XPUT -F file=@upload.json http://dmoneh.github.io/silentsong/files
探查http交互情况
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35$ curl -v -x http://myproxy:8080 http://baidu.com
* Adding handle: conn: 0x652be0
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x652be0) send_pipe: 1, recv_pipe: 0
* About to connect() to proxy myproxy port 8080
* Trying 10.0.0.1...
* Connected to myproxy (10.0.0.1) port 808
> GET http://baidu.com/ HTTP/1.1
> User-Agent: curl/7.30.0
> Host: baidu.com
> Accept: */*
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 200 OK
< Date: Wed, 09 Sep 2015 05:39:38 GMT
* Server Apache is not blacklisted
< Server: Apache
< Cache-Control: max-age=86400
< Expires: Thu, 10 Sep 2015 05:39:38 GMT
< Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
< ETag: "51-4b4c7d90"
< Accept-Ranges: bytes
< Content-Length: 81
< Content-Type: text/html
< Proxy-Connection: Keep-Alive
< Connection: Keep-Alive
< Age: 83195
<
<html>
<meta http-equiv="refresh" content="0;url=http://www.baidu.co
</html>
* Connection #0 to host myproxy left intact仔细看一下上面的信息,> 表示从本地发出的http 头信息,< 表示远端返回的头信息,* 表示 curl额外提供的信息(非标准的http信息)。
我们可以看到代理的一部分工作,接受我们的请求,返回请求数据。相当于一个网关。
3. 总结
curl 是一个很有用的工具,一般人我不告诉的哦。
下一步打算翻译一下 curl man page,做一些页面美化和排版,以方便使用。
敬请关注。