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 秒。
