Invoke-WebRequest o el cURL de PowerShell

Hace algunos días tuve que resolver un pequeño problema que estaba rondando y decidí compartir lo que sé sobre este cmdlet en particular llamado Invoke-WebRequest. Así que a modo de introducción voy a señalar que gracias a su uso es posible monitorear sitios web. Si bien este no es su cometido más destacable, con pocas líneas de código podemos realizar cosas muy interesantes, que nos facilitan la tarea tanto de la parte de administración de los servicios web, como también a la hora de implementar una solución o diagnosticar un estado o situación.

Aquellos que vienen del mundo Linux, o tienen conocimiento sobre la consola en general, se deben estar haciendo una idea de que el comando muy similar al viejo cURL (info aquí). Muy popular porque permite realizar transferencias HTTP, HTTPS, FTP, telnet, etc. En Linux, uno de los usos más habituales es la descarga de archivos o paquetes que se encuentran disponibles en formato HTTP en sistemas sin entorno gráfico.

Trasladando esta situación a entornos Windows, podemos encontrar mayor aplicación en los sistemas core. Pero la mayor particularidad es que a partir de las version 3.0 de PowerShell podemos decir que se incluye cURL en los sistemas Windows, pero siendo éste un alias del comando Invoke-WebRequest. Para comprobarlo, basta con ejecutar desde nuestra consola de PowerShell el comando curl:

Por ejemplo uno de los usos de este comando es descargar elementos de una web. Si queremos descargar una imagen del sitio dominio.com, llamada imagen.jpg, simplemente debemos ejecutar el comando:

Invoke-WebRequest -Uri http://dominio.com/ -OutFile C:\ImagenDescargada.jpg

Descargando la imagen en la raíz del disco C: con el nombre de ImagenDescargada.jpg

Ahora bien, si ejecutamos lo siguiente:

Invoke-WebRequest -Uri http://blog.victorsilva.com.uy | select StatusCode

Nos va a devolver el estado de la web, es decir, si nos devuelve el valor 200, esto indica que la web esta funcionando correctamente. Esto puede ser muy útil a la hora de monitorear varias paginas web, para ver el estado de respuesta, considerando la respuesta anterior de forma similar al “ping”.

Una forma más estilizada de presentar estos datos puede ser de la siguiente manera:

$url = "http://blog.victorsilva.com.uy"

  function Get-WebStatus {
  param(
      $Uri 
  ) 

  $Solicitud = $null 
  $time = try {
      $resultado = Measure-Command {$Solicitud = Invoke-WebRequest -Uri $uri}
      $resultado.TotalMilliseconds
  } catch {
      $Solicitud = $_.Exception.Response 
      $time = -1 
  }

  $resultado = [PSCustomObject] @{ 
      Time = Get-Date; 
      Uri = $uri; 
      StatusCode = [int] $Solicitud.StatusCode; 
      StatusDescription = $Solicitud.StatusDescription; 
      ResponseLength = $Solicitud.RawContentLength; 
      TimeTaken = $time; 
  } 
  $resultado
  }

  Get-WebStatus -Uri $url

Y como resultado obtenemos:

Happy scripting!

Comments