命令列工具 cURL(客戶端 URL)通常用於向伺服器發送或接收資料。該工具的優點是支援多種協定並提供身份驗證、代理、傳輸恢復等功能。
我們也可以在 PowerShell 中使用 cURL,但是您需要了解一些重要的事情。 PowerShell 也有自己的方法來與伺服器傳輸資料。
在本文中,我將解釋如何在 PowerShell 中使用 cURL,並提供一些範例。
PowerShell 捲曲
cURL 自 1997 年以來一直存在,用於與 Web 服務互動、發送或檢索資料。該工具通常用於編寫腳本或自動執行任務。當然,您可能也想在 PowerShell 腳本中使用 cURL。
現在,在我們可以在 PowerShell 中使用 cURL 之前,您需要了解一件重要的事情。在 PowerShell 6 之前,指令 cURL 一直是 PowerShell 中 cmdlet 的別名Invoke-WebRequest
。這導致了許多問題/混亂,因此從 PowerShell 6 開始,命令 cURL 現在實際上呼叫了 curl.exe 實用程式。
我們可以透過尋找命令來看到這一點Get-Command
PowerShell 5 與 PowerShell 7 中的 cmdlet:
如您所看到的,命令curl呼叫了PowerShell 7中的curl.exe,就像我們期望的那樣。但在 PowerShell 5.1 中,該指令實際上是一個別名。
問題是整個文法Invoke-WebRequest
cmdlet 與 cURL 不同,因此您的命令將無法如您的預期運作。
Windows 10/11 上預設安裝了 cURL,但如果您沒有安裝 cURL,那麼您可以在這裡下載。
刪除別名 cURL
如果您想在 PowerShell 5.1 中使用真正的 cURL 命令列實用程序,那麼您有兩個選擇。您可以使用curl.exe作為命令,或刪除別名。我更喜歡後者,因為這將確保您的腳本也可以在 PowerShell 7 上執行。
Remove-Item alias:curl
在 PowerShell 中使用 cURL
那麼讓我們來看看如何在 PowerShell 中使用 cURL 的一些範例。在下面的範例中,我將展示真正的 cURL 方法和 PowerShell 版本,Invoke-WebRequest
讓您更能理解差異。
基本 GET 請求
要簡單地取得特定 URL 的內容,我們可以使用以下命令。
curl https://httpbin.org/ip
Invoke-WebRequest -Uri "https://httpbin.org/ip" # In this case it's better to use, because the output is in JSON Invoke-RestMethod https://httpbin.org/ip
傳送數據
我在下面的範例中使用的 httpbin 端點將僅傳回我們發送給它的數據,但這在本例中是完美的。要使用 cURL 發送數據,我們需要將 HTTP 方法設定為 POST。
curl -X POST https://httpbin.org/anything -d "test=data"
Invoke-WebRequest 方法使用相同的原理,只是語法不同:
$body = "test=data" Invoke-WebRequest -Uri "https://httpbin.org/anything" -Method POST -Body "test=data"
在上面的範例中,我們僅向端點發送單一值,但更常見的是向端點提交表單或發送多個欄位。在 cURL 中,我們可以透過使用 -F 參數指定欄位來做到這一點。
# POST form data with multiple fields curl -X POST https://httpbin.org/post ` -F "name=John Doe" ` -F "[email protected]" ` -F "message=Hello World" # Or for a JSON payload curl -X POST https://httpbin.org/post -H "Content-Type: application/json" ` -d '{"field1":"value1","field2":"value2","field3":"value3"}'
當使用Invoke-WebRequest
方法中,我們可以先使用我們要發佈的表單資料來建立一個雜湊表。為了保持程式碼的可讀性,我們還可以使用雜湊表和儲存所有參數
$formData = @{ name = "John Doe" email = "[email protected]" message = "Hello World" } $post = @{ Uri = "https://httpbin.org/post" Method = 'Post' Body = $formData } Invoke-WebRequest @post
使用身份驗證
大多數 API 都需要某種形式的身份驗證才能使用它傳輸資料。身份驗證有不同的方法,但基本身份驗證(使用者名稱和密碼)或不記名令牌身份驗證是最常用的選項。
要使用 cURL 的基本驗證,您需要以以下格式傳遞使用者名稱和密碼username:passwor
d.在下面的範例中,我們還將在 URL 中新增使用者名稱和密碼,但這僅用於測試目的:
curl -u "username:password" https://httpbin.org/basic-auth/username/password # returns on succesfull authentication { "authenticated": true, "user": "username" }
使用PowerShell方法時,Invoke-WebRequest
,我們首先需要建立一個憑證物件。您可以要求使用者輸入憑證,並使用Get-Credential
cmdlet,但是當您想要將憑證儲存在腳本中時,您需要先將它們轉換為安全字串:
# Get the credentials from the user $Credentials = Get-Credential -UserName "username" -Message "Enter your password" # Or store the credentials in the script $Password = ConvertTo-SecureString "password" -AsPlainText -Force $Credentials = New-Object System.Management.Automation.PSCredential ("username", $Password) Invoke-WebRequest -Uri "https://httpbin.org/basic-auth/username/password" -Credential $Credentials
總結
微軟在 PowerShell 7 中刪除了 cURL 別名是一件好事,因為儘管 cURL 和 Invoke-WebRequest 可能看起來很相似,但 cURL 具有更多的功能。如果您要建立要在其他電腦上執行的腳本,則可以使用下列命令curl.exe
確保使用 cURL 而不是 Invoke-WebRequest。
希望您喜歡這篇文章,如果您有任何疑問,請在下面發表評論。