在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
上尝试了各种变体,但可能会出错。
获取响应代码似乎很简单。
答案 0 :(得分:17)
这是一个例子,虽然它可以帮助您测试重定向以及预期的异常。
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"