##curl命令详解
curl 是常用的命令行工具,用来请求 Web 服务器。它的名字就是客户端(client)的 URL 工具的意思。
它的功能非常强大,命令行参数多达几十种。如果熟练的话,完全可以取代 Postman 这一类的图形界面工具。
如果在一个curl命令中不指定具体的方法,那么默认的就是使用GET方法。对于其它的方法,可以在curl命令中指定:
语法: curl [option] [url]
常用选项:
-A/--user-agent <string> 设置用户代理发送给服务器
-b/--cookie <name=string/file> cookie字符串或文件读取位置
-c/--cookie-jar <file> 操作结束后把cookie写入到这个文件中
-C/--continue-at <offset> 断点续转
-D/--dump-header <file> 把header信息写入到该文件中
-e/--referer 来源网址
-f/--fail 连接失败时不显示http错误
-o/--output 把输出写到该文件中
-O/--remote-name 把输出写到该文件中,保留远程文件的文件名
-r/--range <range> 检索来自HTTP/1.1或FTP服务器字节范围
-s/--silent 静音模式。不输出任何东西
-T/--upload-file <file> 上传文件
-u/--user <user[:password]> 设置服务器的用户和密码
-w/--write-out [format] 什么输出完成后
-x/--proxy <host[:port]> 在给定的端口上使用HTTP代理
-#/--progress-bar 进度条显示当前的传送状态
-X 用来指定请求方式
curl支持协议:
cURL支持的通信协议有:
FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。
curl还支持SSL认证、HTTP POST、HTTP PUT、FTP上传,
HTTP form based upload、proxies、HTTP/2、cookies、用户名+密码认证(Basic, Plain, Digest, CRAM-MD5, NTLM,
Negotiate and Kerberos)、file transfer resume、proxy tunneling。
##基本测试
1,基本用法:
curl www.baidu.com 执行之后,会直接返回访问的默认主页hitml文件内容,
2,保存访问网页:
curl http://www.baidu.com >> baidu.html
3,-A 参数,指定客户端的用户代理头也就是 user-agent ,curl默认用户的代理字符串是curl/[version],用来标识自己使用的os类型,cpu类型,浏览器版本,以及其他标识等等.所以可以用来模拟浏览器发送请求.
$ 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' https://google.com
用来模拟出浏览器访问的情况,
也可以通过-H参数直接指定标头,更改User-agent,
$ curl -H 'User-Agent: php/1.0' https://google.com
4,-b向服务器发送cookie:
$ curl -b 'foo=bar' https://google.com 命令会发送一个cookie:foo=bar,可以用来验证cookie信息.
一个-b后面只能跟一个cookie段.
$ curl -b cookies.txt https://www.google.com 上面命令读取到本地cookie.txt里面存放cookie信息, 将其发送到服务器端,
5, -c 保存cookie
-c参数将服务器设置的cookie写入一个文件中,
$ curl -c cookies.txt https://www.google.com
将服务器的http回应设置cookie写入文本文件中.
6,-d发送POST请求的数据体
-d用于放post请求,
curl -d 'login=wcp&password=123' url
使用了-d参数以后,HTTP请求会自动加上标头:"content-type: application/x-www-form-urlencoded" 并且会自动将请求转换为post方法,因此可以省略-X post
-d参数还可以读取本地文本文件的数据向服务器端发送.
curl -d "@data.txt" url
上面命令读取的data.txt文件的内容,作为数据体向服务器发送,
--data-urlencode自动发送的数据进行url编码,等同于-d,发送post请求的数据体,区别在于会自动的将发送的数据进行url编码.
$ curl --data-urlencode 'comment=hello world' https://google.com/login
7,-e设置http标头的请求的来源
用来设置http标头refer,表示请求的来源
curl -e 'https://google.com?q=example' https://www.example.com
上面的命令将refer标头设置称为了https://google.com?q=example
-H参数可以通过直接添加标头refer,
与上面的区别在于,-e是给的之前的http地址,而-H是写入的refer
curl -H 'Referer: https://google.com?q=example' https://www.example.com
8,-F 上传二进制文件:
用来向服务器上传二进制文件,
$ curl -F 'file=@photo.png' https://google.com/profile
这种方式会给http请求加上标头,Content-Type:multipart/form-data,然后将文件photo.png作为file字段上传,
-F也可以指定MIME类型,也可以指定文件名,
$ curl -F 'file=@photo.png;filename=me.png' https://google.com/profile
上面命令中,原始文件名为photo.png,但是服务器接收到的文件名为me.png。
9,-G构造URL的查询字符串
-G参数是用来构造URL的查询字符串,
$ curl -G -d 'q=kitties' -d 'count=20' https://google.com/search
这个命令会发出一个get请求,有搜索功能,真实的请求url是: https://google.com/search?q=kitties&count=20
如果省略了-G 则是一个post请求. 这里需要注意url的访问格式,
-H指定HTTP请求的标头:
$ curl -H 'Accept-Language: en-US' -H 'Secret-Message: xyzzy' https://google.com
下面命令添加 HTTP 请求的标头是Content-Type: application/json,然后用-d参数发送 JSON 数据。
$ curl -d '{"login": "emma", "pass": "123"}' -H 'Content-Type: application/json' https://google.com/login
也可以设置user-agent绕过服务器检测
curl -H'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:69.0) Gecko/20100101 Firefox/69.0'
-i显示response头信息,并打印源码
返回显示了response头信息内容:
Accept-Ranges: bytes 表示该资源支持byte形式资源返回请求,
Cache-Control: 表示对缓存的控制
Connection: keep-alive 表示连接方式
Content-Length: 2381 表示响应的数据长度,
Pragma: 在请求/响应链附近的一些参数
server: 服务器名称
其他参数信息参考: https://blog.csdn.net/jiang7701037/article/details/98961006
-I参数,是直接返回response头,不打印源码.
-K跳过ssl检测:
$ curl -k https://www.example.com
-L指定HTTP请求跟随服务器的重定向,curl命令默认不会跟随重定向
$ curl -L -d 'tweet=hi' https://api.twitter.com/tweet
–limit-rate 限制HTTP请求和回应的带宽,模拟慢网速的情况
curl --limit-rate 1K www.baidu.com
模拟慢网速下文件加载的情况,
-o 服务器的响应保存成文件,
curl -o example.html www.baidu.com
-O 将url的最后部分当做文件名称保存
$ curl -O https://www.example.com/foo/bar.html
上面命令将服务器回应保存成文件,文件名为bar.html。
-s不输出错误和进度信息,如果不发生错误则正常显示
如果想让curl不产生输出,可以使用:
curl -s -o /dev/null www.baidu.com 命令行窗口不会回显信息.
-u 设置服务器认证的用户名和密码:
```bash
$ curl -u 'bob:12345' https://google.com/login
上面命令设置用户名为bob,密码为12345,然后将其转为 HTTP 标头Authorization: Basic Ym9iOjEyMzQ1。
curl 能够识别 URL 里面的用户名和密码。
-v 输出通信的整个过程,通常用于调试查看,
-x指定HTTP请求代理,
$ curl -x socks5://james:cats@myproxy.com:8080 https://www.example.com
如果没有指定代理协议,默认是http协议,
-x指定代理可用于绕过ip检测
curl -x 127.0.0.1:8080 http://www.baidu.com
-X 用于指定HTTP请求的方法
```bash
curl -X post www.baidu.com
HTTP常见的请求方式:
1,get方法
用于使用给定的URL从给定服务器中检索信息,即是从指定资源中请求数据,使用get方法的请求只是检索数据,并且不应对数据产生其他影响.不对服务端数据做出任何更改操作,get请求方法将参数加在url后面,这样是不安全的,get请求本身不对HTTP协议限制url的大小.但不同的浏览器会进行限制.
2,post请求方式
post方法主要是用来传输实体的主体,可能向服务端提交信息,有可能会更新资源,post请求是对数据传输进行加密相比get方式更加安全.
两者的主要区别:
1、get请求一般用来请求获取数据
post请求一般作为发送数据到后台,传递数据,创建数据
2、get请求也可以传参到后台,但是传递的参数则显示在地址栏,安全性低,且参数的长度也有限制(2048字符)
post请求则是将传递的参数放在request body中,不会在地址栏显示,安全性比get请求高,参数没有长度限制
3、get请求刷新浏览器或者回退没有影响
post则会重新请求一遍,
4.get请求会被缓存,也会保留浏览器的历史记录
post请求不会被缓存,也不好保留在浏览器的历史记录中
5,get请求通常是通过url地址请求
post常见的则是form表单的请求,
6,get请求产生一个tcp数据包
post产生两个tcp数据包
7,get产生的url地址可以被bookmark(打书签)
post方式则不行
8,get请求会被浏览器主动cache
而post不会,除非手动设置,
9,对参数类型,get只接受ASCLL字符,而post没有限制
10、get比post更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
特别注意: 对于get方式,浏览器会把http head和data 一并发送,
而post方式,是先发送head部分,服务器响应后,在发送data数据.
3,put方式
将数据发送到服务器端已创建或更新资源,主要用来上传文件,
4,HEAD请求
HEAD请求主要用来获取报文首部,和get请求类似,但只返回请求的有效性及资源的更新日志等,用来获取报文头
5,DELETE请求
delete方法主要是用来删除某个资源,该方法也不带认证机制,所以一般的网站并不会对它开放使用
6,options请求
options方法用来查询,请求的指定资源都支持什么http方法.也可以用来发送测试请求.
7,connect请求
connect方法用来建立到给定的url标识的服务器隧道,它通过简单tcp/ip隧道更改请求连接,通常使用解码http代理来进行ssl编码的通信.
8,trace请求
trace方法用于沿着目标资源的路径执行消息环回测试,它回应收到请求,它回应收到的请求,以便客户可以看到中间服务器进行了哪些(假设任何)进度或增量。
常见参数:
参考文档:
https://www.cnblogs.com/leizia/p/16322061.html