Błędy w REST – zamieść pod dywan
W poprzednim wpisie wspomniałem o tym, jak czasem praca z REST w PowerShellu jest nieco kłopotliwa i wymaga wiedzy o tym, co PowerShell dokładnie robi (lub raczej: czego nie robi, mimo że powinien). Dziś o nieco innym problemie, który na szczęście w nowszych wersjach PowerShella jest już usunięty i o tym, jak podobny efekt uzyskać w Windows PowerShell (z którego, jak sadzę, nadal korzysta większość użytkowników PowerShella).
Co ciekawe, na problem ten natknęliśmy się również w czasie pracy z PowerShell Universal a konkretniej – w czasie pracy z błędami, które platforma ta usiłowała zwrócić. W PowerShellu na wyjściu dostawaliśmy mało konkretną informację o błędzie, która nie miała nic wspólnego z tym, co nasza końcówka (w odpowiednich okolicznościach) powinna zwrócić. Najpierw końcówka z gwarantowanym błędem o znanej treści:
New-PSUEndpoint -Url /fail -Endpoint { | |
New-PSUApiResponse -StatusCode 404 -Body 'Coś nie bangla!' | |
} -ErrorAction Stop |
Dalej – wynik, jaki uzyskiwaliśmy na wyjściu:
Ta sama w uruchomiona w ramach wersji nowszej zawiera komplet informacji o błędzie, nie tylko o kodzie błędu:
Oczywiście, nie zawsze mamy komfort “przesiadki” na nowszą wersję – co więc, gdy jesteśmy skazani na pracę z wersją starszą? W naszej firmie postanowiliśmy “oryginalne” Invoke-RestMethod opakować i dodać kilka linijek, które zatroszczą się o prawidłową obsługę błędów przekazywanych w ten sposób:
try { | |
Invoke-RestMethod -Uri http://psu.contoso.com/fail -ErrorAction Stop | |
} catch { | |
$szczegółyBłędu = [IO.StreamReader]::new( | |
$_.Exception.Response.GetResponseStream() | |
).ReadToEnd() | |
"Błąd - $_ - $szczegółyBłędu" | |
} | |
# Wynik: | |
# Błąd - The remote server returned an error: (404) Not Found. - Coś nie bangla! |
Zmian było więcej: obsługa innej wersji TLS, praca z “podejrzanymi” certyfikatami, które w środowiskach korporacyjnych nie należą do rzadkości… Grunt, że możemy teraz swobodnie komunikować się z różnymi końcówkami REST, bez konieczności “łatania” kodu za każdym razem.