Estoy escribiendo un script de PowerShell que debe realizar una solicitud web e inspeccionar el código de estado de la respuesta.
He intentado escribir esto:
$client = new-object system.net.webclient
$response = $client.DownloadData($url)
tan bien como esto:
$response = Invoke-WebRequest $url
pero siempre que la página web tiene un código de estado que no es un código de estado de éxito, PowerShell sigue adelante y lanza una excepción en lugar de darme el objeto de respuesta real.
¿Cómo puedo obtener el código de estado de la página incluso cuando no se carga?
powershell
jcarpenter2
fuente
fuente
Respuestas:
Prueba esto:
try { $response = Invoke-WebRequest http://localhost/foo } catch { $_.Exception.Response.StatusCode.Value__}
Es una especie de fastidio que esto arroje una excepción, pero así es.
Actualizar por comentarios
Para asegurarse de que dichos errores aún devuelvan una respuesta válida, puede capturar esas excepciones de tipo
WebException
y obtener el relacionadoResponse
.Dado que la respuesta a la excepción es de tipo
System.Net.HttpWebResponse
, mientras que la respuesta de unaInvoke-WebRequest
llamada exitosa es de tipoMicrosoft.PowerShell.Commands.HtmlWebResponseObject
, para devolver un tipo compatible de ambos escenarios necesitamos tomar la respuesta exitosaBaseResponse
, que también es de tipoSystem.Net.HttpWebResponse
.El código de estado de este nuevo tipo de respuesta es una enumeración de tipo
[system.net.httpstatuscode]
, en lugar de un entero simple, por lo que debe convertirlo explícitamente a int, o acceder a suValue__
propiedad como se describe anteriormente para obtener el código numérico.#ensure we get a response even if an error's returned $response = try { (Invoke-WebRequest -Uri 'localhost/foo' -ErrorAction Stop).BaseResponse } catch [System.Net.WebException] { Write-Verbose "An exception was caught: $($_.Exception.Message)" $_.Exception.Response } #then convert the status code enum to int by doing this $statusCodeInt = [int]$response.BaseResponse.StatusCode #or this $statusCodeInt = $response.BaseResponse.StatusCode.Value__
fuente
$response = try { (Invoke-WebRequest -Uri 'localhost/foo' -ErrorAction Stop).BaseRequest } catch [System.Net.WebException] { $_.Exception.Response }
. Es decir, la recuperaciónBaseRequest
asegura que tanto en escenarios de éxito como de error obtenemos unHttpWebReqponse
. Agregar[System.Net.WebException]
asegura que solo capturamos excepciones relevantes de esta manera / no barremos accidentalmente otros tipos de problemas.Dado que Powershell versión 7.0
Invoke-WebRequest
tiene-SkipHttpErrorCheck
parámetro de cambio.solicitud de extracción de documentos
fuente
-SkipHttpErrorCheck
es la mejor solución para PowerShell 7+, pero si aún no puede usarla, aquí tiene una alternativa simple que es útil para sesiones interactivas de Poweshell en la línea de comandos.Cuando vea una descripción de error para una respuesta 404, es decir,
Luego puede ver el 'último error' desde la línea de comandos ingresando esto:
$Error[0].Exception.Response.StatusCode
O
$Error[0].Exception.Response.StatusDescription
O cualquier otra cosa que le gustaría saber del objeto "Respuesta".
fuente