curl 用法简介

[TOC]

curl 思维导图

简介

curl is a tool to transfer data from or to a server, using one of the supported protocols (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET and TFTP). The command is designed to work without user interaction.

curl 是一个命令行客户端,支持多种传输协议,最经常使用的场景就是在终端请求服务器资源。

curl 命令非常强大,熟练掌握情况下,相当于一个微型终端浏览器。

基本使用

  • 请求资源curl 直接使用的效果就是发送Get请求服务器资源:

    $ curl 'http://httpbin.org/get'
    
  • 指定请求方法:使用选项-X, --request <command>

    $ curl -X GET 'http://httpbin.org/get'  # 默认即使用 GET 请求,故可忽略 -X GET
    $ curl -X POST 'http://httpbin.org/post' # 发送 POST 请求
    

    该选项的参数有:GETPOSTHEADPUTDELETEFTPPOP3IMAPSMTP...

    :一般情况下,-X/--request选项都无需携带,因为很多其他选项都默认带有请求方法的语义。虽如此,但还是推荐请求时携带该选项。

  • 发送请求头:使用选项-H, --header <header/@file>

    # 发送请求头:accept: application/json
    $ curl -X GET 'http://httpbin.org/headers' -H 'accept: application/json'
    
    # 发送 JSON 数据
    $ curl -X POST -d '{"login": "emma","password": 123}' -H 'Content-Type: application/json' 'http://httpbin.org/post'
    
  • 重定向:使用选项-L, --location:

    # curl 默认不会自动重定向
    $ curl -X GET "http://httpbin.org/absolute-redirect/1" -H "accept: text/html"
    
    # 使用 -L 选项使能重定向
    $ curl -X GET "http://httpbin.org/absolute-redirect/1" -H "accept: text/html" -L
    
  • 使用 cookie:使用选项-b, --cookie <data|filename>-c, --cookie-jar <filename>

    # 请求头携带:Cookie: key1=value1;key2=value2 
    $ curl 'http://httpbin.org/cookies' -b 'key1=value1;key2=value2'
    
    # 保存 Cookie: name=whyn 到文件 cookies.txt
    $ curl 'http://httpbin.org/cookies/set/name/whyn' -c cookies.txt
    
    # 从文件中读取 Cookie 信息
    $ curl 'http://httpbin.org/cookies' -b cookies.txt
    
  • 指定 Referer:使用选项-e, --referer <URL>

    # 请求头添加:Referer: http://www.baidu.com
    $ curl 'http://httpbin.org/get' -e 'http://www.baidu.com'
    
    # 当然同样可以直接指定请求头:Referer
    $ curl 'http://httpbin.org/get' -H 'Referer: http://www.baidu.com'
    
    # 重定向时,加上 ;auto,则会自动将第二次请求的 Referer 设置为重定向页面,即:
    # 首次请求:Referer: http://www.baidu.com
    # 第二次请求(重定向):Referer: http://httpbin.org/redirect/1
    $ curl -L 'http://httpbin.org/redirect/1' -e 'http://www.baidu.com;auto'
    
  • 指定 User-Agent:使用选项-A, --user-agent <name>

    # 添加请求头:User-Agent: xxxx
    $ curl 'http://httpbin.org/get' -A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
    
    # 当然同样可以直接指定请求头:User-Agent
    $ curl 'http://httpbin.org/get' -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
    
  • 忽略 SSL 检测:使用选项-k, --insecure

    # 跳过 www.baidu.com 的证书验证
    $ curl -k 'https://www.baidu.com'
    
  • 保存为文件:使用选项-O, --remote-name-o, --output <file>

    # 保存网页,自动命名为 index.html
    $ curl -O 'http://www.baidu.com/index.html' 
    
    # 保存网页,手动命名为 baidu.html
    $ curl -o 'baidu.html' 'http://www.baidu.com/index.html' 
    
    # 下载图片
    $ curl -X GET 'https://upload-images.jianshu.io/upload_images/2222997-88ad51461e1e15ba.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp' -o nginx.webp
    
    # 自动断点续传,注: -C - 后面带一个 -,表示自动续传,否则需要手动指定断点续传字节位置
    $ curl -X GET -C - 'https://upload-images.jianshu.io/upload_images/2222997-88ad51461e1e15ba.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp' -o nginx.webp
    url 
    

    -O/-o选项将 curl 结果重定向到文件,相当于下载资源,其效果等同于wget

  • 查看完整请求信息:使用选项-v, --verbose

    $ curl 'http:/httpbin.org/get' -v
    

    -v/--verbose选项会显示完整的请求通讯过程,其显示内容包含如下几方面:

    • *开头的行:表示 curl 提供的额外信息
    • >开头的行:表示 请求头 内容
    • <开头的行:表示响应头内容

其它选项

  • 查看响应头:使用选项-I, --head

    # 相当于 head 请求
    $ curl 'http://httpbin.org/get' -I
    
  • 查看响应头及响应体:使用选项-i, --include

    $ curl 'http://httpbin.org/get' -i
    
  • 发送表单数据:对应选项有如下几个:

    • -d, --data <data>:以ContentType:application/x-www-form-urlencoded的格式发送表单数据,即key1=value1&key2=value2形式:
    # -d 默认携带 POST 请求语义,故 -X POST 在此可省略
    $ curl -X POST -d 'login=emma&password=123' 'http://httpbin.org/post'
    
    # 可多次使用 -d,数据会自动合并,相当于`login=emma&password=123`
    $ curl -X POST -d 'login=emma' -d 'password=123' 'http://httpbin.org/post'
    
    $ curl -X POST -d "login=@name.txt" -d "password=-"
    

    :对于GET请求的参数,有如下两种格式:

    # 直接拼接到 URL 后面作为参数传递
    $ curl 'http://httpbin.org/anything?name=whyn'
    
    # 使用 -d 选项时,需加上 -G 选项将请求方式设置为 GET 
    # curl 'http://httpbin.org/anything' -G -d 'name=whyn'
    
    • --data-urlencode <data>:如果表单数据需要进行 URL 编码,则使用该选项:
    $ curl -X POST --data-urlencode 'name=emma wild' 'http://httpbin.org/post'
    
    • -F, --form <name=content>:以ContentType: multipart/form-data的格式发送表单数据,一般用于上传文件:
    # 以文件表单进行上传:发送文件 portrait.png,对应表单字段为 profile( @ 用于指定上传文件)
    $ curl -F profile=@portrait.jpg https://example.com/upload.cgi
    
    # 以文本表单进行上传:先读取 hugefile.txt 内容,然后作为字段 story 进行上传( < 表示读取文件内容)
    $ curl -F "story=<hugefile.txt" https://example.com/
    
    # 从标准输入流中读取内容进行上传(- 表示读取标准输入流,此时使用 @ 或 < 均可以)
    $ echo 'Whyn' | curl -X POST -F "name=@-" 'http://httpbin.org/post'
    
    # 发送表单字段 name 和文件 profile,多字段,会产生格式: boundary=------------------------d74496d66958873e
    $ curl -F name=yourname -F profile=@portrait.jpg https://example.com/upload.cgi
    
    # 使用 type 指定上传文件 MIME 类型,默认使用的 MIME 为:application/octet-stream
    $ curl -F "web=@index.html;type=text/html" example.com
    
    # 使用 filename 修改上传文件名,本地使用文件 portrait.jpg,服务器接受到的为 me.jgp
    $ curl -F 'profile=@portrait.jpg;filename=me.jpg' https://example.com/upload.cgi
    
  • 代理:使用选项-x, --proxy [protocol://]host[:port]

    # 使用 HTTP 代理(本地使用 Nginx 搭建一个正向代理,通过 -I 选项可以看到响应头`Server: nginx/1.18.0`,结果由 Nginx 返回,则表示代理成功)
    $ curl -x 'http://localhost:80' 'http://httpbin.org/get' -I
    
    # 使用 socks5 代理
    $ curl -x "socks5://localhost:10808" "https://www.google.com" 
    

    -x, --proxy选项默认使用 HTTP 协议,默认使用端口 1080。

  • 限速:使用选项:--limit-rate <speed>

    # 带宽限制为 200k
    $ curl --limit-rate 200k http://www.badiu.com
    
  • 保存详细的通讯流程:使用选项--trace <file>--trace-ascii <file>

    # 16 进制 dump 文件:显示完整通讯过程
    $ curl 'http://httpbin.org/get' --trace trace.txt
    
    # ascii 码 dump 文件,更加易读
    $ curl 'http://httpbin.org/get' --trace-ascii trace-ascii.txt
    
  • 认证:使用选项:-u, --user <user:password>

    # basic authentication
    $ curl -X GET 'https://httpbin.org/basic-auth/admin/this.is.the.password' -u 'admin:this.is.the.password' --header 'accept: application/json; charset=utf-8'
    

更多其他选项内容,请查看:curl --helpman curlcurl-manpage

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357