告别cURL:拥抱PowerShell原生的Invoke-WebRequest命令 – wiki大全

这是一篇关于在 Windows 环境中,使用 PowerShell 原生的 Invoke-WebRequest 命令来替代传统 cURL 工具的文章。


告别cURL:拥抱PowerShell原生的Invoke-WebRequest命令

对于开发人员、系统管理员和高级用户来说,cURL 是一个家喻户晓的瑞士军刀。这个强大的命令行工具,使用 URL 语法传输数据,支持众多协议,几乎是每个操作系统上进行网络请求任务的首选。然而,在现代 Windows 环境中,尤其是当你沉浸在 PowerShell 的强大生态里时,一个更原生、更集成、更面向对象的替代品早已虚位以待——它就是 Invoke-WebRequest

是时候告别手动下载和配置 cURL.exe 的繁琐,全面拥抱 PowerShell 的原生力量了。

什么是 Invoke-WebRequest

Invoke-WebRequest(别名:iwr)是 PowerShell 内置的一个核心 cmdlet,专门用于在命令行环境中发送 HTTP、HTTPS、FTP 和 FILE 请求。与 cURL 返回原始文本流不同,Invoke-WebRequest 将网络响应解析为一个结构化的对象。这意味着你可以轻松地访问响应头、内容、状态码、链接、图片、表单等所有元素,并将它们无缝地传递给其他的 PowerShell 命令。

核心优势:

  1. 原生集成,无需安装:只要你的系统安装了 PowerShell(Windows 7 及更高版本均内置),Invoke-WebRequest 就已经准备就绪。
  2. 面向对象:返回的是一个丰富的 .NET 对象,而不是纯文本,便于进行结构化数据处理。
  3. 管道(Pipeline)协同:可以与 PowerShell 的管道完美结合,实现强大的自动化工作流。
  4. 一致的语法:遵循 PowerShell “动词-名词” 的命名规范和参数风格,学习曲线平滑。

从 cURL 到 Invoke-WebRequest:常见用法对比

让我们通过一系列实际示例,看看如何将你熟悉的 cURL 命令平滑地迁移到 Invoke-WebRequest

1. 发送基本的 GET 请求

这是最常见的网络请求操作。

cURL:
bash
curl https://api.github.com/users/octocat

Invoke-WebRequest:
powershell
Invoke-WebRequest -Uri https://api.github.com/users/octocat

或者使用别名 iwr:
powershell
iwr https://api.github.com/users/octocat

iwr 命令返回的不仅仅是文本。让我们看看它到底返回了什么:
powershell
$response = iwr https://api.github.com/users/octocat
$response | Get-Member # 查看对象成员

你会发现 $response 对象包含了 StatusCode, Headers, Content, RawContent 等多个实用的属性。要获取 cURL 返回的原始 JSON 内容,只需访问其 Content 属性:
powershell
($response).Content

2. 发送 POST 请求并提交 JSON 数据

向 API 发送数据是另一个核心场景。

cURL:
bash
curl -X POST -H "Content-Type: application/json" -d '{"name":"test"}' https://httpbin.org/post

Invoke-WebRequest:
powershell
$jsonData = @{ name = "test" } | ConvertTo-Json
Invoke-WebRequest -Uri https://httpbin.org/post -Method POST -ContentType "application/json" -Body $jsonData

在这个例子中,我们首先用 PowerShell 的哈希表(@{})创建了一个对象,然后通过 ConvertTo-Json 将其转换为 JSON 字符串。这比手动拼接字符串更安全、更清晰。

3. 下载文件

下载文件是 Invoke-WebRequest 的一个亮点功能,语法非常直观。

cURL:
“`bash
curl -O https://aka.ms/win32-x64-user-stable.zip

或者 curl -o vscode-installer.zip https://aka.ms/win32-x64-user-stable.zip

“`

Invoke-WebRequest:
powershell
Invoke-WebRequest -Uri https://aka.ms/win32-x64-user-stable.zip -OutFile "vscode-installer.zip"

-OutFile 参数直接指定了输出文件的路径,命令执行完毕后,文件将自动保存到指定位置,整个过程非常清晰。

4. 自定义请求头 (Headers)

添加自定义 Header,例如用于身份验证的 Authorization 头。

cURL:
bash
curl -H "Authorization: Bearer Your-Token" https://api.example.com/data

Invoke-WebRequest:
powershell
$headers = @{
"Authorization" = "Bearer Your-Token"
}
Invoke-WebRequest -Uri https://api.example.com/data -Headers $headers

同样,使用哈希表来组织多个 Header,代码可读性和可维护性都远胜于 cURL 中多个 -H 参数的堆砌。

5. 会话管理 (Session & Cookies)

在多个请求之间保持登录状态或跟踪 Cookies 是高级 Web 抓取或 API 测试中的常见需求。

cURL:
cURL 使用 -c (cookie-jar) 和 -b (cookie) 参数来读写 Cookie 文件。
“`bash

登录并将 session cookie 保存到 cookie.txt

curl -c cookie.txt -d “user=admin&pass=123” https://example.com/login

带着 cookie.txt 中的 cookie 访问受保护页面

curl -b cookie.txt https://example.com/dashboard
“`

Invoke-WebRequest:
Invoke-WebRequest 通过 -SessionVariable 参数提供了一个极为优雅的解决方案。
“`powershell

1. 登录并创建一个会话对象,存储在 $webSession 变量中

Invoke-WebRequest -Uri https://example.com/login -Method POST -Body @{user=”admin”; pass=”123″} -SessionVariable webSession

2. 在后续请求中使用 -WebSession 参数,自动带上之前获取的 Cookie

Invoke-WebRequest -Uri https://example.com/dashboard -WebSession $webSession
``
PowerShell 会在
$webSession` 变量中自动管理所有会话相关的 Cookie 和状态,你无需关心底层的文件读写,只需在请求之间传递这个会话对象即可。

PowerShell 的生态优势:不仅仅是请求

Invoke-WebRequest 的真正威力在于它与 PowerShell 生态的无缝集成。

  • 处理 JSON/XMLcURL 获取到 JSON/XML 后,你通常需要借助 jq 或其他工具来解析。在 PowerShell 中,一切都是原生的。

    “`powershell

    直接将返回的JSON内容转换为PowerShell对象

    $data = (iwr https://api.github.com/users/octocat).Content | ConvertFrom-Json
    Write-Host “Octocat’s blog is: $($data.blog)”
    “`

  • Web 抓取Invoke-WebRequest 返回的 ParsedHtml 对象可以让你像使用 BeautifulSoupCheerio 一样方便地解析和操作 DOM。

    “`powershell
    $response = Invoke-WebRequest -Uri https://www.powershellgallery.com/

    获取页面上的所有链接

    $response.Links | ForEach-Object { $_.href }

    获取所有图片

    $response.Images | Select-Object -ExpandProperty src
    “`

  • 错误处理:你可以使用标准的 try...catch 语句块来捕获网络异常,编写更健壮的脚本。

    powershell
    try {
    Invoke-WebRequest -Uri "https://a-non-existent-domain.com" -ErrorAction Stop
    } catch {
    Write-Host "请求失败: $($_.Exception.Message)"
    }

注意:curl 别名陷阱

在较新版本的 Windows 和 PowerShell 中,为了方便用户过渡,系统默认创建了一个 curl 别名,它指向的正是 Invoke-WebRequest

你可以通过 Get-Alias curl 来验证这一点。

“`powershell
Get-Alias curl

CommandType Name Version Source

———– —- ——- ——

Alias curl -> Invoke-WebRequest

“`

这意味着当你直接在 PowerShell 中输入 curl 时,你实际上是在运行 Invoke-WebRequest,并可以使用它的参数(如 -OutFile)。但这也会导致混淆,因为它的行为和参数与原生的 curl.exe 完全不同。如果你确实需要运行真正的 curl.exe,请确保它在你的 PATH 环境变量中,并使用其完整名称 curl.exe 来调用。

结论

cURL 无疑是一个跨平台的传奇工具。但在 Windows 的世界里,Invoke-WebRequest 提供了更现代化、更高效、更一致的体验。它将网络请求从一个孤立的命令,转变为融入强大自动化脚本工作流的一个环节。

下次当你在 PowerShell 窗口中准备敲下 curl 时,不妨停下来,尝试一下 iwr。一旦你体验到其面向对象的便利和与管道的完美融合,你可能就再也回不去了。拥抱原生,释放 PowerShell 的全部潜力!

滚动至顶部