在 Windows 上使用 Curl 的完整指南 – wiki基地


Windows 上使用 Curl 的完整指南

引言:认识强大的 Curl

在当今互联网时代,数据传输无处不在。无论是浏览网页、调用 API,还是下载文件,底层都涉及数据的请求与响应。curl 是一个功能强大的命令行工具和库,用于使用各种协议(如 HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, DICT, TELNET, LDAP, LDAPS, POP3, POP3S, SMTP, SMTPS, RTMP, RTSP, FILE 等)传输数据。

对于开发者、系统管理员乃至普通用户来说,curl 是一个极其有用的工具。它不仅可以用来测试网络连接、模拟 HTTP 请求、自动化任务,还可以作为排查网络问题的利器。

长期以来,Windows 用户可能需要额外安装第三方版本的 curl。但令人欣喜的是,自 Windows 10 version 1803 版本以及 Windows Server 2019 起,Microsoft 已将 curl 作为内置命令集成到系统中。这意味着在大多数现代 Windows 系统上,你可以直接打开命令提示符或 PowerShell 开始使用 curl,无需任何额外安装步骤。

本指南将详细介绍如何在 Windows 环境下使用 curl,从基础用法到高级技巧,帮助你充分发挥它的潜力。

第一部分:获取 Curl 并验证安装

正如引言所述,现代 Windows 版本(Windows 10 version 1803+, Windows 11, Windows Server 2019+)已经内置了 curl

1. 检查 Curl 是否已安装(内置)

打开命令提示符(cmd.exe)或 PowerShell,输入以下命令:

bash
curl --version

如果系统中已经内置了 curl,你将看到类似以下的输出,显示 curl 的版本信息以及支持的协议和特性:

curl 7.55.1 (Windows) libcurl/7.55.1 Schannel zlib/1.2.11
Release-Date: 2017-11-14, security patched
Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile SSPI Kerberos SPNEGO NTLM SPnego HTTPS-proxy

(请注意,Windows 内置的 curl 版本可能不是最新的,但对于大多数日常任务来说已经足够。)

2. 如果系统中没有内置 Curl (旧版 Windows 或需要最新版本)

如果你的 Windows 版本较旧,或者你需要使用最新版本的 curl 以获取最新的协议支持或安全补丁,你需要手动下载并安装它。

  • 官方下载: 访问 curl 官方网站的下载页面:https://curl.se/download.html
    • 找到 Windows 的下载链接。通常会提供各种架构(x86, x64)和不同的 SSL 库版本(如 Schannel, OpenSSL)。
    • 选择一个合适的预编译版本下载(通常是一个 zip 文件)。建议选择 SSPI (Schannel) 版本的 x64 位,因为它使用 Windows 内置的 SSL 库,兼容性更好。
    • 将下载的 zip 文件解压到你选择的一个目录,例如 C:\curl
    • 将该目录添加到系统的环境变量 Path 中。这样你就可以在任何地方直接运行 curl 命令了。
      • 添加 Path 变量的步骤通常是:右键点击“此电脑”或“我的电脑” -> “属性” -> “高级系统设置” -> “环境变量”。在系统变量列表中找到 Path,双击编辑,然后点击“新建”,输入 C:\curl\bin (如果 curl.exebin 文件夹内),然后一路点击“确定”。
      • 添加 Path 变量后,你需要关闭并重新打开命令提示符或 PowerShell 窗口,使更改生效。
  • 使用包管理器 (推荐): 如果你使用 Chocolatey 或 Winget 等包管理器,安装 curl 会非常方便。
    • 使用 Chocolatey: 打开管理员权限的命令提示符或PowerShell,运行 choco install curl
    • 使用 Winget (Windows 10 1709+ 可用): 打开命令提示符或PowerShell,运行 winget install curl.curl

安装完成后,再次运行 curl --version 确认安装成功。

第二部分:Curl 的基本用法

curl 的基本语法非常简单:

bash
curl [选项] [URL]

最简单的用法是直接加上一个 URL,curl 会默认使用 GET 方法请求该 URL,并将响应体(通常是 HTML 内容)打印到标准输出(命令行窗口)。

1. 发送 GET 请求并打印响应体

bash
curl https://www.example.com

这个命令会请求 https://www.example.com 的主页内容,并在你的命令行窗口中显示出来。

2. 下载文件

要将远程资源下载到本地文件,可以使用 -o-O 选项。

  • -o <文件名>:指定下载文件保存到本地的名称。
    bash
    curl -o example_index.html https://www.example.com

    这将把 https://www.example.com 的内容下载并保存为当前目录下的 example_index.html 文件。
  • -O:使用远程文件的原始名称保存到本地。
    bash
    curl -O https://curl.se/logo/curl-logo.svg

    这将把 https://curl.se/logo/curl-logo.svg 文件下载并保存为当前目录下的 curl-logo.svg 文件。

3. 查看请求/响应头信息

curl 不仅可以获取响应体,还可以查看完整的请求和响应过程中的头信息,这对于调试非常有用。

  • -i:显示包含响应头的详细信息。
    bash
    curl -i https://www.example.com

    输出会先显示 HTTP 响应头(如 HTTP/1.1 200 OK, Content-Type, Date, Server 等),然后是响应体内容。
  • -I:仅显示响应头(发送 HEAD 请求)。
    bash
    curl -I https://www.example.com

    这只会显示响应头,不会下载响应体。这对于检查资源是否存在、大小、修改时间等信息很有用。

第三部分:指定 HTTP 方法和发送数据

除了默认的 GET 请求,curl 支持所有主要的 HTTP 方法,并且可以方便地发送请求体数据。

1. 指定 HTTP 方法 (-X)

使用 -X 选项可以指定除了 GET 以外的任何 HTTP 方法,如 POST, PUT, DELETE 等。

bash
curl -X POST https://api.example.com/users
curl -X PUT https://api.example.com/users/123
curl -X DELETE https://api.example.com/users/123

2. 发送请求体数据 (-d, -F)

  • -d <数据>--data <数据>:用于发送 POST、PUT 等请求的数据,通常用于发送表单数据或 JSON 数据。默认情况下,curl 会将 -d 发送的数据使用 application/x-www-form-urlencoded 编码,并自动将请求方法改为 POST。

    • 发送表单数据:
      bash
      curl -d "username=test&password=123456" https://httpbin.org/post
    • 发送 JSON 数据:通常需要同时设置 Content-Type 请求头。
      bash
      curl -X POST -H "Content-Type: application/json" -d '{"name":"test", "age":30}' https://httpbin.org/post

      注意 Windows CMD 的引号问题: 在 Windows 命令提示符 (cmd.exe) 中,单引号 (') 没有特殊含义,不能用于包裹包含双引号的字符串。通常使用双引号包裹整个字符串,内部的引号如果需要保留,则需要转义或使用其他方式处理。对于 JSON 这种结构,通常的做法是使用双引号包裹,内部的键值对的双引号不变。而在 PowerShell 中,单引号和双引号的行为更接近 Linux/Unix shell,单引号包裹的字符串是字面量,双引号包裹的会进行变量替换。因此,上面的 JSON 例子在 CMD 和 PowerShell 中的写法可能是:

      • CMD: curl -X POST -H "Content-Type: application/json" -d "{\"name\":\"test\", \"age\":30}" https://httpbin.org/post (需要转义内部的双引号) 或者更常见且简单的方法是: curl -X POST -H "Content-Type: application/json" -d '{"name":"test", "age":30}' https://httpbin.org/post (如果数据本身不含单引号,CMD 下使用单引号包裹字符串是可行的,尽管不如双引号常见于其他系统。) 或者另一种 CMD 安全写法: curl -X POST -H "Content-Type: application/json" --data-raw "{\"name\":\"test\", \"age\":30}" https://httpbin.org/post (--data-raw 不进行 URL 编码)
      • PowerShell: curl -X POST -H "Content-Type: application/json" -d '{"name":"test", "age":30}' https://httpbin.org/post (单引号包裹字面量字符串,推荐) 或 curl -X POST -H "Content-Type: application/json" -d "{\"name\":\"test\", \"age\":30}" https://httpbin.org/post (双引号包裹,内部双引号需转义 \)
  • -F <name=value>--form <name=value>:用于发送 multipart/form-data 请求,通常用于文件上传或发送复杂的表单数据。

    • 上传文件:
      bash
      curl -F "myfile=@path/to/your/file.txt" https://httpbin.org/post

      @ 符号告诉 curl 发送的是文件内容。

      • Windows 路径注意: 在 Windows 中路径使用反斜杠 \,例如 C:\Users\YourName\document.txt。在命令行中,你通常可以直接使用反斜杠。但如果路径或文件名包含空格或其他特殊字符,需要用双引号包裹整个参数:curl -F "myfile=@\"C:\Users\Your Name\My Document.txt\"" https://httpbin.org/post。在 PowerShell 中,单引号或双引号都可以包裹路径。

第四部分:处理头信息和 Cookies

HTTP 头包含了关于请求和响应的元数据,Cookies 用于维护会话状态。curl 提供了丰富的选项来操作它们。

1. 发送自定义请求头 (-H)

使用 -H 选项可以添加或修改请求头。可以多次使用 -H 来发送多个头。

bash
curl -H "User-Agent: MyAwesomeCurlClient/1.0" -H "Accept-Language: zh-CN,zh;q=0.9" https://www.example.com

常见的应用场景包括:
* 发送 Authorization 头进行身份认证。
bash
# Basic Auth
curl -H "Authorization: Basic YXNkc2FkOmFzZGFzZA==" https://api.example.com/protected
# Bearer Token
curl -H "Authorization: Bearer your_token_here" https://api.example.com/protected

或者使用 -u 选项进行 Basic Auth,curl 会自动编码用户名和密码:
bash
curl -u username:password https://api.example.com/protected

* 设置 Content-Type (如前面发送 JSON 数据的例子)。
* 发送自定义的请求头。

2. 处理 Cookies

  • 查看响应中的 Cookies (使用 -i):响应头中的 Set-Cookie 字段会显示服务器发送的 Cookies。
  • 发送 Cookies (-b <字符串>-b <文件>):
    • 发送单个 Cookie 字符串:
      bash
      curl -b "sessionid=abcdef123456; user_id=789" https://www.example.com/profile
    • 从文件读取 Cookies 并发送 (Netscape cookie file format):
      bash
      curl -b cookies.txt https://www.example.com/profile
  • 保存响应中的 Cookies 到文件 (-c <文件>):
    bash
    curl -c cookies.txt https://www.example.com/login

    这个命令会执行登录请求,并将响应中所有 Set-Cookie 字段设置的 Cookies 保存到名为 cookies.txt 的文件中。这个文件以后可以通过 -b cookies.txt 加载使用。

第五部分:处理 SSL/TLS

在使用 HTTPS 请求时,curl 会验证服务器证书的合法性。在某些特殊情况下(如测试环境使用自签名证书),你可能需要跳过证书验证。

1. 默认行为 (验证证书)

当你请求一个 HTTPS URL 时,curl 会尝试验证服务器证书是否由受信任的根证书颁发机构签发,并且域名是否匹配证书。如果验证失败,curl 会报错并中断连接。

2. 忽略证书验证 (-k--insecure)

使用 -k--insecure 选项可以禁用证书验证。请注意:这会使你的连接容易受到中间人攻击,在生产环境或处理敏感数据时切勿使用此选项。它主要用于测试或连接到已知安全的、但使用了自签名证书或证书链不完整的内部服务。

bash
curl -k https://self-signed-cert.example.com

第六部分:其他常用选项

curl 拥有海量的选项,覆盖了网络传输的方方面面。这里列举一些在 Windows 环境下常用的其他选项:

  • 跟随重定向 (-L--location): 默认情况下,curl 不会自动跟随 HTTP 3xx 重定向。使用 -L 会让 curl 自动跳转到新的位置。
    bash
    curl -L http://shorturl.example.com
  • 显示进度 (-#--progress-bar): 下载大文件时,显示一个简单的进度条。
    bash
    curl -O -# https://largefiles.example.com/bigfile.zip
  • 设置超时时间 (--connect-timeout, --max-time):
    • --connect-timeout <秒>: 连接建立的最大等待时间。
    • --max-time <秒>: 整个操作(连接、传输)的最大允许时间。
      bash
      curl --connect-timeout 10 --max-time 30 https://slowserver.example.com
  • 设置代理 (-x--proxy): 通过代理服务器进行请求。
    bash
    curl -x http://your.proxy.com:8080 https://www.example.com
    # 带认证的代理
    curl -x http://user:[email protected]:8080 https://www.example.com
  • 详细输出 (-v--verbose): 打印更详细的连接过程、发送的请求头、接收的响应头等信息,对于调试非常有用。
    bash
    curl -v https://www.example.com
  • 显示错误但不输出数据 (-f--fail): 当 HTTP 状态码大于或等于 400 时,不输出任何数据并以错误代码退出。用于脚本中判断请求是否成功。
    bash
    curl -f https://api.example.com/nonexistent-resource
  • 恢复下载 (-C -): 恢复之前中断的下载任务。curl 会自动检测已下载文件的大小并从中断处继续。
    bash
    curl -C - -O https://largefiles.example.com/bigfile.zip

第七部分:Windows 环境下的使用技巧与注意事项

尽管 curl 在 Windows 上的使用方法与 Linux/Unix 类似,但 Windows 命令行的特性(尤其是 CMD 和 PowerShell 的区别)会导致一些细微但重要的差异。

1. 引号和特殊字符

这是 Windows 用户使用命令行工具时最常遇到的问题。

  • CMD (cmd.exe):
    • 双引号 (") 用于包裹包含空格或特殊字符的字符串。
    • 单引号 (') 在 CMD 中没有特殊含义,它们被视为普通字符。因此,如果你需要传递一个包含双引号的字符串(如 JSON),使用单引号包裹整个字符串是一个常用的技巧,前提是字符串本身不包含单引号:
      bash
      # 在 CMD 中发送 JSON
      curl -H "Content-Type: application/json" -d '{"key": "value with \"quotes\""}' https://httpbin.org/post

      如果字符串同时包含单引号和双引号,情况会更复杂,可能需要转义 (^") 或使用 --data-raw 并小心处理。
    • 特殊字符如 &, <, >, |, ^ 在 CMD 中有特殊含义(后台执行、重定向、管道、转义)。如果它们是 URL 或数据的一部分,需要使用 ^ 进行转义:
      bash
      # 在 CMD 中请求包含 & 的 URL 参数
      curl "https://www.example.com/search?q=term1^&category=cat2"
  • PowerShell:
    • 双引号 (") 包裹的字符串会进行变量替换和命令展开。
    • 单引号 (') 包裹的字符串是字面量,不会进行任何解释或替换,这使得它非常适合包裹复杂的 URL、JSON 数据或包含特殊字符的字符串。
      powershell
      # 在 PowerShell 中发送 JSON
      curl -H "Content-Type: application/json" -d '{"key": "value with \"quotes\""}' https://httpbin.org/post
      # 在 PowerShell 中请求包含 & 的 URL 参数
      curl 'https://www.example.com/search?q=term1&category=cat2'
    • 特殊字符通常在单引号字符串中可以直接使用,但在双引号字符串中可能需要使用反引号 ` 进行转义。

建议: 在 Windows 上,尤其是在处理复杂的 URL 或请求体时,优先使用 PowerShell,因为它对引号和特殊字符的处理更直观,更接近其他操作系统。如果必须使用 CMD,请务必注意转义规则。

2. 路径

Windows 使用反斜杠 \ 作为路径分隔符。在 curl 命令中指定本地文件路径时,可以直接使用反斜杠:

bash
curl -F "myfile=@C:\Users\YourName\Documents\report.csv" https://httpbin.org/post
curl -o C:\Downloads\homepage.html https://www.example.com

如果路径包含空格或其他特殊字符,务必用双引号包裹整个路径字符串。

3. 命令行历史和编辑

  • 在 CMD 中,可以使用上下箭头键浏览历史命令。doskey /h 查看完整的历史记录。按 F7 显示一个历史命令选择框。
  • 在 PowerShell 中,上下箭头键提供更强大的历史命令功能(包括智能匹配)。

4. 复制粘贴

在现代 Windows 终端(如 Windows Terminal 或改进后的命令提示符/PowerShell 窗口),可以直接使用 Ctrl+CCtrl+V 进行复制粘贴。在旧版 CMD 窗口中,可能需要右键菜单选择“标记”和“复制”,或者在属性中启用快速编辑模式使用右键粘贴。

第八部分:与其他工具的比较(简述)

在 Windows 上,除了 curl,还有其他一些工具可以用于网络请求:

  • PowerShell 的 Invoke-WebRequest (alias iwr) 和 Invoke-RestMethod (alias irm): 这些是 PowerShell 原生的 cmdlet,功能也很强大,尤其适合在 PowerShell 脚本中使用。它们提供了更结构化的输出对象,而不是简单的文本流。然而,curl 的优势在于其跨平台一致性、极其丰富的选项以及作为独立可执行文件的灵活性。
  • 浏览器开发者工具: 对于调试网页和 API 调用,浏览器内置的开发者工具(F12)提供了图形化的界面,更易于检查请求/响应的细节。但它们不适合自动化任务或在脚本中使用。

对于需要进行自动化、脚本化或跨平台操作的用户来说,学习和使用 curl 是非常有价值的。

结论

curl 是一个极其强大且灵活的网络数据传输工具。自 Windows 10 起,它已成为系统的内置命令,大大方便了 Windows 用户的使用。

本指南涵盖了 curl 在 Windows 上的获取方式、基本的数据请求和下载、HTTP 方法、请求体数据发送、头信息和 Cookies 的处理、SSL/TLS 注意事项以及其他常用选项。特别强调了 Windows 命令提示符和 PowerShell 在处理引号和特殊字符上的差异,这是 Windows 用户必须掌握的关键点。

掌握 curl 将显著提升你在网络调试、API 交互、自动化任务等方面的效率。从简单的网页抓取到复杂的 API 调用,curl 都能胜任。实践是最好的学习方法,现在就打开你的 Windows 命令行窗口,开始你的 curl 之旅吧!记住,curl --help 永远是你最好的朋友,它能提供所有选项的详细说明。

祝你使用 curl 愉快!


发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部