Invoke-WebRequest e Invoke-RestMethod
Cmdlet per interagire con siti web e API HTTP, equivalenti di curl e wget.
Invoke-WebRequest (iwr)
Restituisce l'intera risposta HTTP: stato, intestazioni, contenuto.
Invoke-WebRequest https://esempio.it
(Invoke-WebRequest https://esempio.it).StatusCode
(Invoke-WebRequest https://esempio.it).Headers
(Invoke-WebRequest https://esempio.it).Content
Invoke-WebRequest https://esempio.it -Method Head
Scaricare un file:
Invoke-WebRequest https://esempio.it/file.zip -OutFile .\file.zip
Invoke-WebRequest https://esempio.it/file.iso -OutFile D:\file.iso -Resume
In Windows PowerShell 5.1 la barra di avanzamento rallenta molto i download grandi:
$ProgressPreference = 'SilentlyContinue'
Aggiungi -UseBasicParsing in 5.1 se Internet Explorer non è configurato.
Invoke-RestMethod (irm)
Pensato per le API: converte automaticamente JSON e XML in oggetti.
Invoke-RestMethod https://api.ipify.org?format=json
(Invoke-RestMethod https://api.github.com/repos/PowerShell/PowerShell).stargazers_count
Invoke-RestMethod https://api.esempio.it/utenti | Select-Object nome, email
Metodi, intestazioni e corpo
$headers = @{ Authorization = "Bearer $token"; Accept = "application/json" }
Invoke-RestMethod https://api.esempio.it/dati -Headers $headers
$corpo = @{ nome = "Michele"; ruolo = "admin" } | ConvertTo-Json
Invoke-RestMethod https://api.esempio.it/utenti -Method Post -Headers $headers -Body $corpo -ContentType "application/json"
Invoke-RestMethod https://api.esempio.it/utenti/1 -Method Put -Body $corpo -ContentType "application/json"
Invoke-RestMethod https://api.esempio.it/utenti/1 -Method Delete
| Parametro | Significato |
|---|---|
-Method | Get, Post, Put, Patch, Delete, Head |
-Headers | Hashtable di intestazioni |
-Body | Corpo della richiesta |
-ContentType | Tipo del corpo |
-Credential | Autenticazione di base |
-TimeoutSec | Timeout in secondi |
-SkipCertificateCheck | Ignora errori del certificato (solo PowerShell 7+, da evitare) |
-OutFile | Salva su file |
Form e upload
Invoke-RestMethod https://esempio.it/login -Method Post -Body @{ utente = "x"; pass = "y" }
Invoke-RestMethod https://esempio.it/upload -Method Post -Form @{ file = Get-Item .\foto.jpg }
-Form è disponibile da PowerShell 7.
Gestire gli errori
try {
$r = Invoke-RestMethod https://api.esempio.it/dati -ErrorAction Stop
} catch {
$_.Exception.Response.StatusCode.value__
$_.Exception.Message
}
TLS in Windows PowerShell 5.1
Se ricevi errori di canale sicuro con siti moderni:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Estrarre dati da una pagina
$r = Invoke-WebRequest https://esempio.it
$r.Links | Select-Object href, innerText
$r.Images.src
([regex]::Matches($r.Content, '<title>(.*?)</title>')).Groups[1].Value
Controllare un sito
try { (Invoke-WebRequest https://esempio.it -UseBasicParsing -TimeoutSec 10).StatusCode } catch { "ERRORE: $($_.Exception.Message)" }
Attenzione
curlewgetin Windows PowerShell 5.1 sono alias diInvoke-WebRequeste non hanno le stesse opzioni. Per il vero curl usacurl.exe.- Mai eseguire script scaricati senza averli letti, soprattutto con schemi come
irm https://... | iex.