把 cURL 玩出花样,让程序员效率升级

张小胖是一名 Android 程序员,吭哧吭哧写了一下午代码,终于把今天的开发任务完成了。

“嗯,就差最后一哆嗦了!”,看着自己写的代码就像看一件艺术品,手上不停,熟练的使用快捷键,Run App。

嗯?好像是接口返回的数据有问题,肯定是服务端写出了 Bug,可别耽误晚上和小亚的约会。心里一边回忆之前学习的“ 说话艺术 ”,同时保持微笑的对服务端小哥说。“诶,这个接口返回的数据好像有点问题,你能帮我看看是不是我传的参数不对”。

“啊,迟点再看?那个…我晚上还有事儿,想早点回,你看能不能先帮我看看”

“把请求参数给你,你迟点再看?这不好弄吧,这么多参数,又是 Header 又是 POST 请求的,一个一个复制很麻烦啊?”

“哦,用 curl 啊。”

张小胖表面平静的打开 Google,输入 “curl” Enter…

什么是 curl?

初识 curl

curl 是利用 URL 语法,在命令行方式下工作的开源传输工具。它支持文件的上传和下载,是一款综合传输工具。

curl 支持很多传输协议,包括比较常见的 HTTP、HTTPS、FTP、SMTP 等。

curl 作为命令行下使用的工具,它可以通过简单的字符串的形式,来表达支持的这些协议的所有细节。

MacOS 和发行版的 Linux 系统中,都是内置了 curl的,对于 Windows,也是可以通过一些工具来在命令行中使用 curl,例如 winpty。

这里举几个简单的例子感受一下。

// 向 baidu.com 发起请求
curl "https://www.baidu.com"
// 将网页保存到本地
curl "https://www.baidu.com" > a.html
// 下载一个图片到本地
curl -O "https://ws2.sinaimg.cn/large/006tKfTcly1fpzmg0hppuj30rs0b474v.jpg"

这都是最简单的 curl 的使用,例如我们可以通过 -H 增加 HTTP Header,通过 -x 为请求加一层代理,通过 -d 发送一个 POST 请求等等。

更多细节大家看通过 curl -help 命令看一下帮助文档就清晰了。

curl 'https://www.baidu.com/' -H 'Connection: keep-alive' -H 'Cache-Control: max-age=0' -H 'Upgrade-Insecure-Requests: 1' -H 'User-Agent: Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Mobile Safari/537.36' -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: zh-CN,zh;q=0.9'  --compressed

上面是通过 Chrome DevTools 中,从百度首页的请求中,复制出来的 curl,算是一个比较常见的 curl 格式了。

curl 能做什么

curl 包含了所有传输协议的细节,例如 HTTP 协议,用 curl 就可以直接发起一个 HTTP 请求,并且完美的支持,让协议中所有的细节一目了然。

那么我们通常在什么场景下会用到 curl 呢?这里举几个例子。

1. 客户端服务端调试解耦

在开头的情况下,张小胖只需要通过抓包的方式,将有疑问的 HTTP 请求的 curl,发给服务端小哥,服务端小哥就可以在任何时候完美的模拟此次请求。

以此来做到,客户端和服务端在调试上的解耦,有问题各自查各自的。

2. 简单的爬虫

对于一些公开的数据,没有很复杂的逻辑结构。想要抓取数据,用 curl 就非常的合适,简单的逻辑我们用 shell 脚本也可以解决。

毕竟我们的目的是爬一些数据,这种脚本可能用一次就作罢了,性能什么的完全不考虑,首要考虑的因素就是快。

3. 增长黑客眼中的 curl

范冰在《增长黑客》一书中提到使用 curl 的例子,就非常的有意思。

某次冷启动一款社交产品的时候,因为用户数太少了,他们就准备爬取了一些别的产品中的用户头像,以此来模拟虚拟的用户,那他们是怎么做到的呢?

通过浏览器请求,确认头像图片的 URL 为类似 “http://aliimg.xxxapp.com/cache/photo/194402263_640_640.jpg” 这样的地址,其中 640 就是图片的尺寸,而 194402263 则是用户的 ID。他们通过尝试发现 194402263 是一个自增的数,也就是可以通过变换这个值,来获取到不同用户的头像。

这下就简单了,一行简单的 curl 命令,就搞定了图片的爬取工作。

curl -O http://aliimg.changba.com/cache/photo/[260929610-260939610]_640_640.jpg

这段 curl 命令,可以下载 260929610 ~ 260939610 范围内的所有的用户头像。

到本文发布之时,此段 curl 脚本依然有效,有兴趣的可以试试。

通过一对方括号,就可以解决图片爬取的问题,是不是比我们写脚本去爬,更简单。

curl 从哪里获得

常用 curl 的人,当然可以徒手写 curl,但是大多数时候,我们并不需要这样做。

curl 发展到现在,好用到已经嵌入到我们开发中使用的各种工具里。例如:浏览器 Chrome 以及抓包工具 Charles。

1. Chrome DevTools

2. Charles

我们只需要在需要的时候,找到这个请求,将 curl 串复制出来就可以使用。

将 curl 转换成代码

光有 curl 命令,有时候还是没法满足我们的需求,身为开发,我们终归是要写代码的。

所以有时候,我们需要根据 curl 命令,复刻出我们需要的代码,这些,依然有工具来帮我们完成。

例如在 postman 中,我们就可以很方便的将请求转换成我们需要的代码,下面的示例中,就包含了 curl 导入,以及转换成代码的步骤。

如果不想使用 postman,还有在线的工具可以选择。

例如:https://curl.trillworks.com

这个网站支持的语言,没有 postman 丰富,不过一般主流的脚本语言,它都是支持的。

小结时刻

curl 使用起来非常的简单,它本身就能完美的描述各种网络协议,是我们必须掌握的一个工具。

具体你能将 curl 玩出什么花来,就看你的想象力了。欢迎在留言区分享你使用 curl 的技巧。

本文对你有帮助吗? 留言、好看、转发 是最大的支持,谢谢!

「联机圆桌」:point_left:推荐我的知识星球,一年 50 个优质问题,上桌联机学习。

公众号后台回复成长『 成长 』,将会得到我准备的学习资料,也能回复『 加群 』,一起学习进步;你还能回复『 提问 』,向我发起提问。

我来评几句
登录后评论

已发表评论数()

相关站点

+订阅
热门文章