在PowerShell中获取HTTP请求并容忍500服务器错误

Eri*_*ikE 14 powershell http-request

在Powershell v3.0中,我想从HTTP GET返回响应代码,例如200 OK500 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;
}
Run Code Online (Sandbox Code Playgroud)

问题当然是$_没有Response财产.也不是$_.InnerException,即使是演员:

return [System.Net.WebException]($_.InnerException)
Run Code Online (Sandbox Code Playgroud)

我玩过$_ | Get-Member并探索过它的所有属性.我认为$_.TargetObject有一些承诺,但它似乎没有.

(更新)我也认为我尝试过变种$_.Exception.Response虽然可能弄错了.

获取响应代码似乎是一件非常简单的事情.

小智 19

这是一个例子,虽然它允许您测试重定向以及预期的异常.

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"
Run Code Online (Sandbox Code Playgroud)