curl简介
简单来说,curl是一个用url方式,来和服务器进行文件传输和下载的工具。它不仅仅支持HTTP协议,还支持了其他的众多的协议,例如DICT/FILE/FTP/FTPS/Gopher/HTTP/HTTPS/IMAP/IMAPS/LDAP/LDAPS/POP3/POP3S/RTMP
等。
curl工具格式和选项
格式:
1 | curl [options] [URL...] |
重要选项:
1 | -X method, --request method #指定使用http的method,有GET/POST/PUT/DELETE等等,默认是GET方法 |
curl使用的例子
1 | curl http://www.example.com |
备注:狭义地说,curl像是一个浏览器,但是比浏览器的支持的东西要多,因为它不仅支持HTTP协议,还支持其他很多的协议。
关于使用curl命令的-d参数携带HTTP request的请求体request body一些问题
HTTP Requset请求头中的Content-Type
是用来说明请求体的MIME类型的,默认是application/x-www-form-urlencoded
类型。curl -d
参数是用携带POST/PUT
请求的请求体内容的,有如下几种支持的格式:
(1)第一种
1 | curl -d "param1=value1¶m2=value2" -X POST http://localhost:3000/data |
备注:Content-Type
缺省为application/x-www-form-urlencoded
,所以使用param1=value1¶m2=value2
格式时,可省略。
(2)第二种
1 | curl -d "param1=value1¶m2=value2" -H "Content-Type: application/x-www-form-urlencoded" -X POST http://localhost:3000/data |
备注:使用param1=value1¶m2=value2
格式时,也可以显式地指出application/x-www-form-urlencoded
。
(3)第三种
1 | curl -d '{"key1":"value1", "key2":"value2"}' -H "Content-Type: application/json" -X POST http://localhost:3000/data |
备注:使用json格式的数据,一定要显式地指明Content-Type
为application/json
。
(4)第四种
1 | curl -d "@data.txt" -X POST http://localhost:3000/data |
备注:将param1=value1¶m2=value2
格式的数据单独放入文件,然后通过-d "@filename"
来引入。
(5)第五种
1 | curl -d "@data.json" -H "Content-Type: application/json" -X POST http://localhost:3000/data |
备注:将json格式的数据单独放入文件,然后通过-d "@filename"
来引入。
curl的一些其他问题
在使用curl做POST的时候,当要POST的数据大于1024字节的时候,curl并不会直接就发起POST请求,而是会分为两步:
(1)发送一个请求,包含一个Expect:100-continue,询问Server使用愿意接受数据
(2)接收到Server返回的100-continue应答以后,才把数据POST给Server
这是libcurl的行为。具体的RFC相关描述:http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.2.3
于是,这样就有了一个问题,并不是所有的Server都会正确应答100-continue,比如lighttpd,就会返回417 “Expectation Failed”,则会造成逻辑出错。
要解决的办法也挺容易:
1 | curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); |
学习资料参考于:
https://gist.github.com/subfuzion/08c5d85437d5d4f00e58
http://www.ruanyifeng.com/blog/2011/09/curl.html