携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第25天,点击查看活动详情
你也可以手敲一个高速下载器(十)Curl 请求
前言
我们上一节增加了请求头的参数,但实际常用的还有请求方法和请求的数据,而不过在下载数据这一场景中不怎么常见而已,但我们也要支持啊。那就面临另外的一个问题了,传递的信息太多了,太麻烦了,为了解决这个问题,我们可以采用传递curl
命令字符串的形式来做到
Curl是啥?
Curl是一个可以发起请求的命令,一个完整的curl命令可以包含我们想要的任何信息,如:请求头、请求体、请求方法、URL、认证信息、代理信息等等。
我们怎么用
我们获取下载的地址,一般是通过浏览器,那么大部分的浏览器会有一个功能就是把当前的请求信息复杂成curl
的格式,如Chrome内核系列的浏览器:
这里需要的是,如果是在Windows平台上面,要选择“Copy as cURL(bash)”
才可以,而如果是mac系统则只会出现一个,直接点击复制就好
长什么样子?
curl 'https://www.xxx.com' \
-H 'Accept: */*' \
-H 'Referer: ' \
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36' \
--compressed
都啥意思
上面就是我们在浏览器中复制好的字符串,其中包含了请求的URL和请求头的信息,但其实curl的参数有很多,比如:
-
-X(--request):请求的方法
-
-A(--user-agent):需要传递的user-agent
-
-e(--referer):引用的地址(referer)
-
-u(--user):用户认证的信息
-
-x(--proxy):用户的代理信息
-
-d(--data)(--data-raw):用户的传递的数据
-
-F(--form)(--form-string):用户的传递的数据
-
-I(--head):使用
head
请求访问url -
-m(--max-time):请求的最大时间
-
-H(--header):请求头
-
--compressed:请求压缩(使用deflate 或gzip)
-
......
需求参数
curl参数有很多,上面只是例举了一些常用的参数,但即便是这些,我们是并不是都能用到的。所以我们就要根据我们需求,整理出想要的参数在做解析
浏览器生成
我们设想中的使用场景是curl字符串不是人为写的,而是浏览器自动生成的,所以一些浏览器不会生成的那种方便性参数就不必要进行解析了,如:
- -u(--user)
- -X(--request)
- --request
这几个参数都是会包含在header中的,而浏览器生成的命令只会携带-H(--header)
参数,我们也就不需要解析了
代理
-x(--proxy)
参数是代理的意思,按照实际用途来说这个功能是很有用的,我们后期也有支持这个功能,但是代理信息一般是手动的设置,而不是由浏览器去生成,这个情况实际是很少的
data参数及form参数
data参数和form参数其实是有很多种的类型的,是根据Content-Type
来决定的,但是我们这里只处理json
类型的数据,其它的暂且不管
最终包含的参数
-
-X(--request):请求的方法
-
-H(--header):请求头
-
-d(--data)(--data-raw):用户的传递的数据
-
-F(--form)(--form-string):用户的传递的数据
-
-H(--header):请求头
解决方案
需求弄清楚了,就要看解决方案。可以通过以下几个方向去考虑:
直接可以用的第三方工具
首先对于像curl
这种常用的工具,是有很大的可能性是直接就存在与各种语言相互转换的程序,我们可以去找找有没有类似的可以直接供我们使用
有可以相互转换的工具,但是用其他语言
可能会找到这种的工具,虽然实现了功能,但是却不是使用熟悉的语言写的,这时就是看能不能把它转化为你熟悉的语言
独自实现
实在没有就要独自实现了,但也不要闭门造车。要能分析出功能点,就查询最佳的解决方案,比如这个例子里面curl
的命令,你可以用切割字符串的方式,或者各种for
循环,但如果细想一下,这个是不是属于shell 命令行
的格式呢?安装这个思路再去查询搜索可能就会得到不一样的答案
结语
这节说了curl
相关的知识,什么是curl
,我们为什么要支持它,支持到什么程度,怎么去解决它。虽然这节没有代码,但这却是动手写代码之前必须要做的工作。下节详细说说具体实现,敬请期待!!!