Получите HTTP-запрос и допустите ошибку сервера 500 в powershell
В Powershell v3.0 я хотел бы вернуть код ответа из HTTP GET, например 200 OK
или 500 Internal Server Error
. (Это для взлома-развертывания, чтобы быстро развернуть развернутый сайт и посмотреть, работает ли он, своего рода мини-приемочный тест. Код состояния - это все, что я хочу.)
Против моих пожеланий HttpWebRequest.GetResponse
выдает сообщение об ошибке, когда он получает 500 Internal Server Error
. Это раздражает, потому что это не ошибка для меня в моем случае использования. Во всяком случае, я решил, что могу поймать исключение и все еще очистить базовый код ответа, но у меня проблемы с этим.
Вот несколько почти рабочий код:
function WebResponseStatusCode (
[Parameter(Mandatory=$true)][string] $url
) {
$req = [system.Net.HttpWebRequest]::Create($url)
try {
$res = $req.GetResponse();
$statuscode = $res.statuscode;
}
catch [System.Net.WebException] {
#the outer error is a System.Management.Automation.ErrorRecord
Write-Host "error!"
return = $_.Response.statuscode; #nope
}
finally {
if (!($res -eq $null)) {
$res.Close();
}
}
return $statuscode;
}
Проблема, конечно, в том, что $_
не имеет свойства Response
. Также $_.InnerException
, даже при нажатии:
return [System.Net.WebException]($_.InnerException)
Я играл с $_ | Get-Member
и изучал все его свойства. Я думал, что у $_.TargetObject
есть некоторые обещания, но это не похоже на.
(Обновить). Я также думаю, что я пробовал варианты на $_.Exception.Response
, хотя, возможно, неправильно.
Получение просто кода ответа кажется таким простым делом.
Ответы
Ответ 1
Вот пример, хотя он делает еще пару вещей, чтобы вы могли тестировать перенаправления, а также ожидаемые исключения.
function GetWebSiteStatusCode {
param (
[string] $testUri,
$maximumRedirection = 5
)
$request = $null
try {
$request = Invoke-WebRequest -Uri $testUri -MaximumRedirection $maximumRedirection -ErrorAction SilentlyContinue
}
catch [System.Net.WebException] {
$request = $_.Exception.Response
}
catch {
Write-Error $_.Exception
return $null
}
$request.StatusCode
}
GetWebSiteStatusCode -testUri "https://www.google.com/"
GetWebSiteStatusCode -testUri "https://www.google.com/foobar"
GetWebSiteStatusCode -testUri "http://google.com/" -maximumRedirection 0
GetWebSiteStatusCode -testUri "https://accounts.google.com" -maximumRedirection 0
GetWebSiteStatusCode -testUri "https://www.googleapis.com/coordinate/v1/teams/1/custom_fields?fields=1111&key="
GetWebSiteStatusCode -testUri "https://www.googleapis.com/shopping/search/v1/test/products/sasdf/asdf/asdf?key="
#Next test would be for an expected 500 page.
#GetWebSiteStatusCode -testUri "https://www.somesite.com/someurlthatreturns500"