4xx / 5xx'de istisna oluşturmadan Powershell web isteği


82

Bir web isteği yapması ve yanıtın durum kodunu incelemesi gereken bir powershell komut dosyası yazıyorum.

Bunu yazmayı denedim:

$client = new-object system.net.webclient

$response = $client.DownloadData($url)

bunun kadar iyi:

$response = Invoke-WebRequest $url

ancak web sayfası başarı durum kodu olmayan bir durum koduna sahip olduğunda, PowerShell devam eder ve bana gerçek yanıt nesnesini vermek yerine bir istisna atar.

Yüklenemese bile sayfanın durum kodunu nasıl alabilirim?


Bu benim için çalıştı docs.microsoft.com/en-us/powershell/module/… Örnek 7: Invoke-WebRequest'ten başarılı olmayan mesajları yakala
user3520245

Yanıtlar:


121

Bunu dene:

try { $response = Invoke-WebRequest http://localhost/foo } catch {
      $_.Exception.Response.StatusCode.Value__}

Bunun bir istisna yaratması biraz serseri ama bu böyle.

Yorum başına güncelleme

Bu tür hataların hala geçerli bir yanıt döndürdüğünden emin olmak için, bu tür istisnaları yakalayabilir WebExceptionve ilgili olanları getirebilirsiniz Response.

İstisnanın cevabı tipte olduğu için System.Net.HttpWebResponse, başarılı bir Invoke-WebRequestçağrının cevabı tipte Microsoft.PowerShell.Commands.HtmlWebResponseObjectolduğu için, her iki senaryodan da uyumlu bir tip döndürmek için BaseResponse, yine tipte olan başarılı cevapları almamız gerekir System.Net.HttpWebResponse.

Bu yeni yanıt türünün durum kodu [system.net.httpstatuscode], basit bir tamsayıdan ziyade bir enum türündedir , bu nedenle, onu int'e dönüştürmeniz veya Value__sayısal kodu almak için yukarıda açıklandığı gibi özelliğine erişmeniz gerekir .

#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__

5
Teşekkürler, işe yaradı. Sadece Response nesnesine Exception nesnesinden erişebileceğinizi fark etmemiştim.
jcarpenter2

1
Evet, gerçek kod numarasına ulaşmak biraz zordu. :-)
Keith Hill

Gitmem bu kodu Chris Wahl, wahlnetwork.com/2015/02/19/… '
FoxDeploy

11
Biraz daha iyi bir yol: $ response = deneyin {Invoke-WebRequest localhost / foo } catch {$ _. Exception.Response} Bu şekilde her iki durumda da $ response değişkeninde bir şey elde edersiniz. Ancak, bir hatanın bir HtmlWebResponse döndürdüğünü, ancak bir başarının bir HtmlWebResponseObject döndürdüğünü unutmayın. Özellikle, bunların üzerindeki Durum Kodu farklı türlerdir (iç çekiş ..)
Rob Cannon

4
Rob'un harika öneri ufak tefek ayarlamalarla Bir çift farklı türde sorunu önlemek için: $response = try { (Invoke-WebRequest -Uri 'localhost/foo' -ErrorAction Stop).BaseRequest } catch [System.Net.WebException] { $_.Exception.Response }. Yani getirme BaseRequest, hem başarı hem de hata senaryolarında bir HttpWebReqponse. Eklemek, [System.Net.WebException]yalnızca bu şekilde ilgili istisnaları yakalayabilmemizi / kazara diğer türdeki sorunları incelemememizi sağlar.
JohnLBevan

6

Powershell sürümü yana 7.0 Invoke-WebRequestvar -SkipHttpErrorCheckanahtar parametresi.

-SkipHttpErrorCheck

Bu parametre cmdlet'in HTTP hata durumlarını yok saymasına ve yanıtları işlemeye devam etmesine neden olur. Hata yanıtları, sanki başarılıymış gibi boru hattına yazılır.

Bu parametre PowerShell 7'de tanıtıldı.

dokümanlar çekme isteği


0

-SkipHttpErrorCheck PowerShell 7+ için en iyi çözümdür, ancak bunu henüz kullanamıyorsanız, burada etkileşimli, komut satırı Poweshell oturumları için yararlı olan basit bir alternatif var.

Bir 404 yanıtı için bir hata açıklamasını gördüğünüzde, yani

Uzak sunucu bir hata verdi: (404) Bulunamadı.

Ardından şunu girerek komut satırından 'son hatayı' görebilirsiniz:

$Error[0].Exception.Response.StatusCode

Veya

$Error[0].Exception.Response.StatusDescription

Veya `` Response '' nesnesinden öğrenmek istediğiniz başka ne varsa.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.