curl
是一个非常强大且灵活的命令行工具,用于获取或发送数据,无需用户图形界面交互。它支持多种协议,并且可以在脚本中使用,以实现自动化任务。
基本介绍
- curl 是 “Client URL” 的缩写,它是一个利用 URL 语法在命令行下工作的文件传输工具。
- 版本:
curl
最初发布于 1997 年。 - 支持的协议: 包括 HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, DICT, TELNET, LDAP, LDAPS, RTMP, RTSP, POP3, POP3S, IMAP, IMAPS, SMTP, SMTPS 等。
- 功能: 下载文件、上传文件、执行 HTTP 请求、测试网络服务可用性等。
- 库:
curl
包含了一个名为libcurl
的库,用于程序开发。
安装
如果系统中没有安装 curl
,可以通过包管理器安装:
sudo apt-get install curl # Debian/Ubuntu
sudo yum install curl # CentOS/RHEL
sudo pacman -S curl # Arch Linux
命令格式
curl [选项] [目标URL]
常用选项
-X, --request <command>
: 指定请求方法(GET, POST, PUT, DELETE 等)。-d, --data <data>
: 发送数据到服务器。-u, --user <user:password>
: 指定用户名和密码。-o, --output <file>
: 将输出写入文件。-O, --remote-name
: 直接保存远程文件名。-L, --location
: 跟随重定向。-I, --head
: 获取头部信息。-v, --verbose
: 显示详细信息。-V, --version
: 显示版本信息。-s, --silent
: 静默模式,不显示进度条。-H, --header <header>
: 自定义头部信息。-A, --user-agent <agent>
: 设置 User-Agent 字段。-i, --include
: 包含头部信息在输出中。-J, --remote-header-name
: 使用远程文件的名称。-T, --upload-file <file>
: 上传文件。-x, --proxy <host:port>
: 使用 HTTP 代理。-b, --cookie <name=value>
: 发送 Cookie。-c, --cookie-jar <filename>
: 保存 Cookie 到文件。-e, --referer <url>
: 设置 Referer 字段。-m, --max-time <seconds>
: 设置最大时间限制。-k, --insecure
: 允许连接到不受信任的 SSL 站点。-f, --fail
: 服务器返回错误时退出。
示例
-
下载文件:
curl http://example.com/file.txt -o file.txt
-
发送 POST 请求:
curl -X POST -d "param1=value1¶m2=value2" http://example.com/api
-
模拟浏览器:
curl -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" http://example.com
-
使用代理:
curl -x proxy.example.com:8080 http://example.com
-
上传文件:
curl -T localfile ftp://example.com/remote/path/
-
获取头部信息:
curl -I http://example.com
基本 GET 请求
最简单的 GET 请求就是直接指定 URL,curl
会自动使用 GET 方法获取资源:
curl http://example.com
这将打印出从 http://example.com
获取的 HTML 内容。
包含查询参数
如果你需要向 URL 添加查询参数,可以直接在 URL 后面加上 ?
和参数字符串:
curl 'http://example.com/?q=query+string¶m=value'
或者你可以使用 -G
或 --get
选项来明确地指定 GET 请求,并使用 -d
或 --data
来添加参数:
curl -G 'http://example.com/' -d 'q=query+string' -d 'param=value'
设置请求头
你还可以设置自定义的 HTTP 头部信息,例如设置 User-Agent
或 Accept
:
curl -H 'User-Agent: MyCustomAgent/1.0' -H 'Accept: application/json' http://example.com
跟随重定向
如果你要访问的 URL 可能会被重定向,可以使用 -L
或 --location
选项来跟随重定向:
curl -L http://example.com
保存响应到文件
如果你想将响应的内容保存到文件而不是显示在终端上,可以使用 -o
或 --output
选项:
curl http://example.com -o output.html
输出 HTTP 头部信息
如果你想查看服务器返回的 HTTP 头部信息,可以使用 -I
或 --head
选项:
curl -I http://example.com
或者使用 -i
或 --include
选项来同时输出头部信息和主体内容:
curl -i http://example.com
限制请求时间
如果你希望设置请求的最大时间限制,可以使用 -m
或 --max-time
选项:
curl -m 10 http://example.com
这里的时间单位是秒。
使用代理
如果你需要通过代理服务器访问网站,可以使用 -x
或 --proxy
选项:
curl -x proxy.example.com:8080 http://example.com
发送 POST 请求是 curl
的一个常用功能。下面是一些示例来说明如何使用 curl
发送 POST 请求。
基本 POST 请求
发送一个基本的 POST 请求,包括一个简单的参数:
curl -X POST -d "param1=value1¶m2=value2" http://example.com/api
这里的 -X POST
指定了请求方法为 POST,而 -d
参数用来传递 POST 数据。
使用 JSON 数据
如果你需要发送 JSON 格式的数据,可以使用 -H
添加 Content-Type 为 application/json
,并使用 -d
或 -F
来发送 JSON 数据:
curl -X POST \-H "Content-Type: application/json" \-d '{"key1":"value1", "key2":"value2"}' \http://example.com/api
注意,如果你发送的是 JSON 格式的字符串,最好使用单引号 ('
) 来避免 shell 对双引号 ("
) 中的特殊字符进行转义。
使用文件中的 JSON 数据
如果 JSON 数据存储在一个文件中,可以读取该文件内容并发送:
curl -X POST \-H "Content-Type: application/json" \-d @path/to/data.json \http://example.com/api
这里 @path/to/data.json
表示从文件中读取 JSON 数据。
使用表单数据
对于表单数据,你可以使用 -F
或 --form
选项来发送数据,这样可以更好地处理文件上传和其他表单字段:
curl -X POST \-F "username=john" \-F "password=secret" \-F "file=@/path/to/local/file" \http://example.com/upload
这里 -F
用于发送表单字段,@/path/to/local/file
用于指定要上传的文件。
设置 HTTP 头部信息
你也可以设置其他 HTTP 头部信息,比如 User-Agent
或者 Authorization
:
curl -X POST \-H "User-Agent: MyCustomAgent/1.0" \-H "Authorization: Bearer ACCESS_TOKEN" \-d "param1=value1¶m2=value2" \http://example.com/api
使用代理
如果你需要通过代理服务器发送 POST 请求,可以使用 -x
或 --proxy
选项:
curl -X POST \-x proxy.example.com:8080 \-d "param1=value1¶m2=value2" \http://example.com/api
附加认证
如果 API 需要基本认证,你可以使用 -u
或 --user
选项来提供用户名和密码:
curl -X POST \-u "username:password" \-d "param1=value1¶m2=value2" \http://example.com/api
限制请求时间
如果你想限制整个请求的最大时间,可以使用 -m
或 --max-time
选项:
curl -X POST \-m 10 \-d "param1=value1¶m2=value2" \http://example.com/api
这里的 10
表示 10 秒。