Oggi ho avuto necessità di eseguire una serie di richieste HTTP tramite uno script da linea di comando su un server Windows. Se avessi avuto a disposizione un OS Linux avrei potuto risolvere la cosa utilizzando il noto comando cURL, più o meno nel seguente modo:
1 |
> curl http://www.mysite.com/ |
Sfortunatamente Windows non dispone di un comando analogo: lo strumento che più gli si avvicina - il poco noto BITSAdmin Tool - è pensato per lavorare a task e job, quindi può rivelarsi poco pratico nel contesto di una esecuzione tramite script.
Fortunatamente, grazie a Powershell, è possibile ricorrere a un'alternativa molto più semplice - e decisamente più potente - utilizzando le classi esposte dal namespace System.Net, tra cui l'arcinoto - per chi programma in ASP.NET - System.Net.WebClient.
cURL
Per emulare il comportamento del comando Linux cURL, è sufficiente creare un file cURL.ps1 contenente la seguente riga di codice:
1 |
(new-object System.Net.WebClient).DownloadString("http://www.mysite.com") |
In questo modo il contenuto del response HTTP ci verrà restituito sotto forma di stringa. Nel caso in cui volessimo invece averlo come array di byte, è possibile utilizzare il metodo DownloadData, che funziona nello stesso modo:
1 |
(new-object System.Net.WebClient).DownloadData("http://www.mysite.com") |
Wget
Per emulare il comportamento del comando Linux Wget, è sufficiente creare un file wget.ps1 contenente la seguente riga di codice:
1 |
(new-object System.Net.WebClient).DownloadFile("http://www.mysite.com", 'C:\Temp\file') |
Come si può facilmente vedere, la tecnica utilizzata è sempre la medesima: in questo caso utilizzeremo il metodo DownloadFile, che consente di specificare un percorso di destinazione per il file che ci sarà restituito dal server.
Ignorare gli errori di certificato SSL
Nell'improbabile caso in cui avessimo bisogno di indirizzare le nostre request HTTP verso server o servizi HTTPS con un certificato non valido o non firmato da una autorità di certificazione attendibile - ad esempio, per inviare richieste a servizi ad uso esclusivamente interno dotati di certificati auto-firmati - è possibile utilizzare la proprietà ServicePointManager.ServerCertificateValidationCallback, anch'essa fornita dal namespace System.Net, per disabilitare i controlli di trust del protocollo SSL.
Per far sì che questo accada, è sufficiente ggiungere la seguente riga di codice alle istruzioni descritte in precedenza:
1 |
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}; |
Ecco quindi i comandi aggiornati:
1 2 |
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}; (new-object System.Net.WebClient).DownloadString("https://www.mysite.com") |
1 2 |
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}; (new-object System.Net.WebClient).DownloadData("https://www.mysite.com") |
1 2 |
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}; (new-object System.Net.WebClient).DownloadFile("https://www.mysite.com", 'C:\Temp\file') |
Per il momento è tutto: spero che queste informazioni potranno esservi utili con le vostre request!