Invoke-WebRequest - armazena conteúdo da solicitação mesmo em erro?

2

Estou usando Invoke-WebRequest do Powershell (isso também se aplica a Invoke-RestMethod ) para fazer uma chamada para um cluster do ElasticSearch. Esse comando específico geralmente retorna um resultado de erro ( 409 conflict ).

O Powershell vê o estado do erro, gera um erro e não passa nada de útil no pipeline, e expele o corpo da resposta no console:

No entanto, a) mesmo que tenha um código de erro, eu realmente não me importo que esteja com erro (só que ele tenha retornado) eb) Eu quero poder acessar o corpo dessa resposta para que eu possa realmente inspecionar os dados contidos dentro.

Existe alguma maneira de o PowerShell suprimir a saída de erro ( -ErrorAction não funciona) e passar algo útil ao longo do pipeline?

Como nota, eu realmente quero invocar isso com Invoke-RestMethod , mas como ele e Invoke-WebRequest são essencialmente o mesmo comando, eu generalizei essa questão para Invoke-WebRequest

    
por Mark Henderson 08.08.2016 / 17:51

1 resposta

3

Ano passado eu escrevi um script para diagnosticar problemas comuns de configuração do IIS, ele está no GitHub , para isso eu precisei analisar a resposta do servidor, mesmo para resultados não-200, especialmente para resultados não-200, portanto, Invoke-WebRequest não funcionou.

Eu removi algumas coisas e o código essencial está abaixo.

Eu uso o .NET System.Net.WebRequest porque, mesmo se um System.Net.WebException for lançado, você ainda poderá acessar o fluxo de resposta com os cabeçalhos de resposta e o corpo.

$url = "http://localhost"

try {
    $r = [System.Net.WebRequest]::Create($url)
    $r.UserAgent=$userAgent
    $resp = $r.GetResponse()        

    Write-host "Response Headers:" 
    foreach ($HeaderKey in $resp.Headers) {
            $caption = $HeaderKey.PadLeft(15," ")
            Write-host "$caption': $($resp.Headers[$HeaderKey])";
    }                            

    $reqstream = $resp.GetResponseStream()
    $sr = New-Object System.IO.StreamReader $reqstream
    $body = $sr.ReadToEnd()
    Write-host "$body"

    $resp.StatusCode 
}           
catch [System.Net.WebException] 
{              
    $resp = $_.Exception.Response

    if ($resp -eq $null)
    {
        Write-host $_.Exception
    }
    else
    {
        $reqstream = $resp.GetResponseStream()
        $sr = New-Object System.IO.StreamReader $reqstream
        $body = $sr.ReadToEnd()

        Write-host -Text "Response Headers:" 
        Echo "         Status: $([int]$resp.StatusCode) - $($resp.StatusCode)"
        foreach ($HeaderKey in $resp.Headers) {
                $caption = $HeaderKey.PadLeft(15," ")
                Write-host "$caption': $($resp.Headers[$HeaderKey])";
        }
        Write-host "$body"

        $resp.StatusCode                
    }                    

} catch {            
    Write-host  $_.Exception
}
    
por 08.08.2016 / 19:20