cURL 必知必会

cURL 必知必会(英文版网址)

cURL 项目的组成部分

cURL 项目主要由两部分组成:

  • 命令行工具 curl;
  • 提供 C API 的 libcurl 库;

这两个工具和库都基于网络协议,为指定的 URL 资源执行网络传输。

curl 的默认配置文件

  • 类 Unix 系统:.curlrc 文件。
  • Windows 系统:_curlrc 文件。

-h:列出所有的命令行选项

列出 curl 命令行工具所有的选项,并提供简要的说明:

curl -h
curl --help

输出 curl 整个手册以及常见的用例教程:

curl --manual

-v:详细(verbose)模式

让 curl 切换到详细模式:

curl -v http://example.com
curl --verbose http://example.com

让 curl 打开详细模式并进行 HTTP 重定向:

curl -vL http://example.com
curl --verbose --location http://example.com

关闭详细模式:

curl --no-verbose http://example.com

不使用 schema

URL 是 curl 的操作对象。实际上,更准确的名称是 URI(统一资源标识符)。

URL 以 “schema” 作为开头,schema 是 “http://” 这部分内容的官方名称,用以告诉 curl 传入的 URL 使用了哪个协议。

curl 允许用户省略 URL 的 schema 部分。curl 会根据主机名的第一部分猜测要使用哪种协议。可检测的协议包括 FTP、DICT、LDAP、IMAP、SMTP 和 POP3。没有提供 schema 的其他 URL 将默认使用 HTTP 协议。

可以通过 --proto-default 选项将默认协议修改为 HTTP 以外的其他协议

身份验证

使用给定的用户名和密码列出 FTP 服务器目录中的内容:

curl ftp://user:[email protected]/

Basic 身份验证:要让 curl 发出带有身份验证的 HTTP 请求,可以用 -u--user 选项提供用户名和密码:

curl -u admin:123456 http://example.com/

如果要让 curl 先确认服务器是否真的需要身份验证,可以使用 --anyauth 选项,它会自动使用 curl 所知道的最安全的身份验证方法。curl 将尝试无须身份验证的请求,然后在必要时使用身份验证:

curl --anyauth --user admin:123456 http://example.com/

使用 .netrc 文件或配置文件可以避免在命令行上指定用户名和密码

主机名或地址

指定 IPV4 地址:

curl http://127.0.0.1/

使用 IPV6 地址需要将其放在方括号中

curl http://[::1]/
curl http://[2001:0db8:3c4d:0015:0000:0000:1a2f:1a2b]/

指定 FTP 类型

告诉 curl FTP 资源的文件类型以适应不同的传输模式。

ASCII 类型:

curl "ftp://example.com/foo;type=A"

二进制类型(默认):

curl "ftp://example.com/foo;type=I"

目录类型:

curl "ftp://example.com/foo;type=D"

多个选项和多个 URL

curl 支持数百个命令行选项和无限数量的 URL。

curl 会在处理完最后一个 URL 后返回一个退出码。

可以通过 --fail-early 选项让 curl 在第一次出现错误时就退出

--next:在一组选项和 URL 之间插入间隔

当命令行解析到 --next 选项时,它会将后面的选项应用于下一组 URL

curl --location http://example.com/1 --next
     --data sendthis http://example.com/2 --next
     --head http://example.com/3

URL 通配

curl 使用保留符号 []{} 进行通配。可以使用 -g--globoff 禁用它。

数值范围、字母范围、列表

可以使用 [N-M] 语法来指定一个数值范围,其中 N 是起始索引,M 是结束索引。

请求 100 个以数字命名的图像:

curl -O http://example.com/[1-100].png
curl -O http://example.com/[001-100].png

支持指定步进,指定步进为2:

curl -O http://example.com/[1-100:2].png

curl 也可以处理字母范围

curl -O http://example.com/section[a-z].html

通过花括号指定完整的列表:

curl -O http://example.com/{one,two,three,alpha,beta}.html

组合使用多个通配符

下载 Ben、Alice 和 Frank 的图像,并且需要 100x100 和 1000x1000 的分辨率:

curl -O http://example.com/{Ben,Alice,Frank}-{100x100,1000x1000}.jpg

获取 Web 服务器和邮件服务器一周内的日志:

curl -O http://example.com/{web,mail}-log[0-6].txt

--config:配置文件

使用 -K 或者 --config 选项让 curl 从特定的文件中读取更多的命令行选项:

curl -K cmdline.txt http://example.com

cmdline.txt 文件中包含了你输入的每行命令:

# 这是注释,我们要求跟踪重定向
--location
# 要求发送 HEAD 请求
--head
# 支持使用不带破折号的长选项
location
# 命令行选项的参数必须与该选项处于同一行
user-agent "Everything-is-an-agent"
# 支持在选项与参数之间使用=或者:
user-agent = "Everything-is-an-agent"
# 如果参数中带有空格,则必须使用双引号
# 如果想在配置文件中指定 URL,则必须使用 --url 或 url
url = "http://example.com"

进度指示器

  • 进度指示器显示的单位是字节(Byte, 1 Byte = 8 bit)数和每秒字节数。
  • 通过 -s--silent 选项可以强制关闭进度指示器。
  • 启用静默模式后,可以通过 -s--show-error 选项来要求它在发生错误时输出错误信息。
  • 通过 -#--progress-bar 选项使用一个更简单的进度指示器。

--trace--trace-ascii

--trace [filename] 选项可以将完整的跟踪信息(十六进制编码)保存在指定的文件中。
--trace-ascii [filename] 可以将跟踪信息转化为 ASCII 编码。
--trace-time,在输出信息前添加高精度的时间戳。

curl --trace dump http://example.com

HTTP/2

在使用 HTTP/2 进行文件传输时,curl 将发送和接收被压缩的标头信息。但是为了以可读性和可理解的方式显示传出和传入的 HTTP/2 标头信息,curl 将显示未经压缩的版本

保存下载的内容

可以通过 -o [filename]--output 保存下载内容到指定的文件。

curl -o output.html http://example.com/

-O(大写的 O)或 --remote-name:用 URL 指定的文件名保存内容:

curl -O http://example.com/file.html

--compressed:压缩

curl 可以要求 HTTP 和 HTTPS 服务器提供压缩过的数据。

--compressed 请求服务器使用一种受支持的压缩算法来压缩数据,curl 会在保存或发送数据到 stdout 之前对数据进行解压。

curl --compressed http://example.com/

压缩传输编码

客户端要求服务器进行压缩传输编码,如果服务器接受了,它将作出响应,并通过一个标头指明它将进行压缩编码,curl 将在接收到数据时对其进行解压。

用户可以通过 --tr-encoding 选项请求服务器进行压缩传输编码:

curl --tr-encoding http://example.com/

不过需要注意的是,并非所有的 HTTP 服务器都支持这个特性。

shell 重定向

使用 > filename 将 stdout 重定向到指定文件中,使用 2>file 将 stderr (元数据或错误等)重定向到指定文件中。

curl http://example.com > files.html 2>errors

速率限定

在传输数据时,curl 会尝试尽快完成任务。它可以用于上传和下载。

可以使用 --limit-rate [speed] 让 curl 的速率不超过指定的字节/秒。

curl https://example.com/ --limit-rate 200k

最大的文件

为 curl 指定可接受的最大下载字节数:

curl --max-filesize 100000 https://example.com/

在文件系统中保存元数据

在将下载的内容保存到文件时,可以通过 --xattr 选项告诉 curl 将某些文件元数据也保存在“扩展文件属性”中。

--raw

如果使用 --raw 选项,curl 会禁用所有内部的 HTTP 内容解码或传输编码,取而代之的是传输未经修改的原始数据。

如果你正在开发某种中间软件,并希望将内容传给另一个 HTTP 客户端让它来解码,那么这个选项就很有用了。

失败重试

通常 curl 只会尝试执行一次传输不成功则返回错误。你可以使用 --retry 选项让 curl 重试失败的传输。

恢复下载

在恢复下载时,curl 会检查本地已存在的文件的大小,然后向服务器请求剩余的内容,并追加到本地的文件中。

-C--continue-at 选项可以告诉 curl 从哪里开始传输,选项的值可以是一个普通的数字字节偏移量,或者使用字符串 - 让 curl 根据它所知道的信息自己决定从哪里开始传输。

从字节偏移量为 100 的位置开始下载 FTP 文件:

curl --continue-at 100 ftp://example.com/bigfile

继续之前中断的下载:

curl --continue-at - ftp://example.com/bigfile

HTTP 区间

可以用 -r 或者 --range 让 curl 发起区间请求,请求特定区间的数据。

向远程服务器请求特定字节范围的内容。请求从偏移量 100 开始的 1000 个字节:

curl --range 100-1099 ftp://example.com/bigfile

请求前 200 个字节的数据:

curl -r 0-199 http://example.com/

索引 200 之后的所有内容:

curl -r 200- http://example.com/

从索引 0 处获取 200 个字节,再从索引 1000 处获取 200 个字节:

curl -r 0-199,1000-199 http://example.com/

连接超时

可以用 --connect-timeout 设置 curl 允许尝试连接的最长时间。

keepalive

curl 默认使用 TCP 的 keepalive 特性实现长连接。

使用 --no-keepalive 禁用 keepalive 特性:

curl --no-keepalive https://example.com/

使用 --keepalive-time 来指定发送探测的频率,默认为 60 秒。

将 TCP “ping” 之间的间隔改为 5 分钟:

curl --keepalive-time 300 https://example.com/

允许的最长时间

在 curl 抛出超时错误码(28)并退出前,可以用 -m--max-time 选项告诉 curl 最长有多少时间(以秒为单位)可用。当指定的时间耗尽,无论当时发生什么,curl 都会退出,即使它正在传输数据。

指定的最长时间可以用小数表示,0.5 表示 50 毫秒,2.37 表示 2370 毫秒:

curl --max-time 5.5 https://example.com/

传输速率慢到一定程度就退出

你可以告诉 curl,如果传输速率低于某个特定值,并且在某个时间段内一直低于这个值,那么就放弃传输。

例如,如果 15 秒内的传输速率低于 1000 字节/秒,则停止传输:

curl --speed-time 15 --speed-limit 1000 https://example.com/

启用 TLS

使用 --ss1 选项意味着 cur1 会尝试将连接升级到 TLS,但如果失败,它仍将继续使用明文协议来执行传输。

curl --ssl http://example.com/file.txt

如果一定要使用 TLS 连接,可以使用 -ssl-reqd 选项,使用这个选项时如果 curl 无法成功进行 TLS 协商,传输就会失败。

curl --ssl-reqd http://example.com/file.txt

HTTP 版本

从 2016 年年中开始,curl 默认用 HTTP/1.1 连接 HTTP 服务器。如果要连接到 HTTPS 服务器,并且你的 libcurl 内置了 HTTP/2 功能,那么 cur1 将尝试使用 HTTP/2,或在协商失败时降级至 HTTP/1.1。默认情况下,不支持 HTTP/2 的 curl 将使用 hTTP/1.1。

HTTP POST

POST 是为将数据发送到 Web 应用而发明的 HTTP 方法,也是 HTML 表单中最常用的方法。它通常会向接收者发送相对少量的数据块。

在表单中填充好数据后,浏览器以“URL编码”的形式(以&符号分隔的一系列键值对)将数据发送出去。可以用 curl 的 -d-data 选项发送这样的数据,如下所示:

curl -d 'name=admin&shoesize=12' http://example.com/

Content-Type

用 curl 的 -d-data 选项发送 POST 请求时,请求中默认会包含一个类似 Content-Type: application/X-www-form-urlencoded 这样的标头。

如果想将 JSON POST 到服务器,并且准确地告诉服务器你发送的内容是什么类型,可以参见如下代码:

curl -d '{json}' -H 'Content-Type:application/json' http://example.com/

POST 二进制内容

--data-binary @filename 选项可以让 curl 从文件中读取二进制内容。

curl --data-binary @filename http://example.com/

URL 编码

curl 提供了 --data-urlencode 选项,可以让用户输入未经编码的数据,然后让 curl 自动编码。

转换为 GET

-G--get 选项可以将 -d 选项指定的数据附加到 URL 右边,并使用 “?” 隔离,然后让 curl 用 GET 方法发送数据。

curl --get --data  

curl --include \
     http://localhost:7001/api/v1/applications \
     --get --data 'name1=value1&name2=value2'

分块编码的 POST

通过使用分块传输编码,curl 将逐块发送 POST 数据,每个数据块中会包含块的大小。

curl -H "Transfer-Encoding: chunked" -d "payload to send" http://example.com/

使用 curl 发送表单

multipart formpost 是指 HTTP 客户端在 HTML 表单的 enctype 属性被设置为 “multipart/form-data” 时所发送的内容。

HTML 示例:

Name:
File:

使用 curl 时,可以通过-F(或 --form)选项添加每个单独的 multipart。

使用 curl 发送以上的表单数据:

curl -F person=anonymous -F [email protected] http://example.com/submit.cgi

HTTP 重定向

顾名思义,“重定向”是指服务器向客户端发送指令,而不是返回客户端想要的内容。服务器好像在说:“去这里找你想要的东西。”

但并非所有的重定向都是一样的。重定向是永久性的吗?客户端在下一个请求中应该使用哪种请求方法?

进行重定向时需要发送一个 Location: 标头其中包含新的 URI,可以是绝对路径或相对路径。

自定义标头

可以通过 -H--header 选项自定义标头。

curl -H "Host: test.example" http://example.com/

referer

当用户点击网页上的链接时,浏览器会将用户带到下一个 URL,它会在新的请求中添加 referer 标头,表面请求的来源。

可以在 curl 中用 -e--referer 选项来设置 referer 标头:

curl --referer http://comes-form.example.com https://example.com/

User-Agent

客户端可以在请求中设置 User-Agent 标头,用于告诉服务器它属于哪种用户代理。有时服务器会检查这个标头,并根据标头内容决定如何作出响应。

可以用 -A--user-agent 选项加上要使用的字符串来设置你喜欢的值:

从文件中读取 cookie

curl 使用的 cookie 文件格式叫做 Netscape cookie 格式。

-b 指示让 curl 从指定的文件读取初始 cookie:

curl -L -b cookies.txt https://example.com/

将 cookie 写入文件

让 curl 在退出之前将已知的 cookie 写入文件(也就是 cookie jar)中。

可以用 -c 选项指定 cookie jar,让 curl 将 cookie 写入该文件中:

curl -c cookie-jar.txt https://example.com/

新 cookie 会话

刷新 cookie 会话意味着所有会话 cookie 都将被丢弃,这相当于重启浏览器。

可以通过 -j--junk-session-cookies 选项让 curl 开始新的 cookie 会话:

curl -j -b cookies.txt https://example.com/

HTTP/2

默认情况下,发起 HTTP 请求时,curl 默认用 HTTP/1.1 连接 HTTP 服务器。而发起 HTTPS 请求时,curl 会默认使用 HTTP/2

可以用以下代码让 curl 请求服务器时使用 HTTP/2:

curl --http2 http://example.com/

如果你已经知道服务器支持 HTTP/2(例如,在自己的受控环境中,你确切地知道服务器上运行的是什么),那么可以通过 --http2-prior-knowledge 选项进行快捷的 HTTP/2 “协商”。

多路复用

HTTP/2 协议的主要特性之一是能够在同一物理连接上复用多个逻辑流。在使用 curl 命令行工具时,你无法利用这个很酷的特性,因为 curl 严格按照串行的方式执行网络请求,一个接一个,后一个要在前一个结束后才能开始。

希望未来的 curl 版本可以支持这项特性。

你可能感兴趣的:(cURL 必知必会)