如果404,Powershell REST请求将不会返回服务器响应

时间:2018-11-13 14:37:33

标签: json powershell httprequest response

我仍然对Powershell还是陌生的,至今还找不到任何东西。我正在对URI运行REST GET请求,由于没有找到资源,我实际上知道从服务器返回404。

我希望能够运行一个条件检查条件是否为404,如果是这种情况,则跳过该条件进行进一步处理,但是当我将请求分配给变量,然后再调用它时,它只会给出我所要求的内容。我以前从未用其他语言看到过这样的东西……

我的基本前提如下。我首先获取所有组名,然后遍历该名称数组,将当前名称包含在新的URL中,并对该特定组进行额外的请求,以查找始终具有相同名称的SHIFT。如果该组没有按名称列出的班次,我想跳到下一个组,否则更改该新找到的班次对象的某些属性。

这是我的代码的样子,如您所见,它的行为不正确

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$user = '******'
$pass = ConvertTo-SecureString '*******' -AsPlainText -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $user, $pass
$req  = Invoke-WebRequest -Credential $cred -Uri https://********-np.xmatters.com/api/xm/1/groups
$res  = ConvertFrom-Json $req.Content
$content = $res.data

$base = "https://********-np.xmatters.com/api/xm/1/groups"
$group_name = $content[0].targetName
$path = "$base/$group_name/shifts/MAX-Default Shift"

$shift = Invoke-RestMethod -Credential $cred -Uri $path

Write-Host '-----------------------'
Write-Host $shift
Write-Host '-----------------------'



... RESPONSE BELOW ....



Invoke-RestMethod : The remote server returned an error: (404) Not Found.
At \\MMFILE\********$\MyDocuments\Group Supers PReliminary.ps1:16 char:10
+ $shift = Invoke-RestMethod -Credential $cred -Uri $path
+          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

-----------------------
@{id=***********; group=; name=MAX-Default Shift; description="; start=2018-08-21T04:00:00.000Z; end=2018-08-22T04:00:00.000Z; timezone=America/New_York; recurrence=;
 links=}
-----------------------

PS C:\WINDOWS\system32> 

我想做的是用简写代码if $shift.code == 404 ... skip ... else ... run additional query

2 个答案:

答案 0 :(得分:2)

您需要使用try ... catch。

$code = ""

try{
    $shift = Invoke-RestMethod -Credential $cred -Uri $path
}
catch{
    $code = $_.Exception.Response.StatusCode.value__
}

if($code -eq "404")
{
    continue
    # Other things
}
else
{

    Write-Host '-----------------------'
    Write-Host $shift
    Write-Host '-----------------------'
}

答案 1 :(得分:1)

您可以通过Try..Catch禁止显示错误消息,从而允许脚本继续执行:

Try {
    $Shift = Invoke-RestMethod http://www.google.com/fakeurl -ErrorAction Stop
    #Do other things here if the URL exists..
} Catch { 
    if ($_.Exception -eq 'The remote server returned an error: (404) Not Found.') {
       #Do other things here that you want to happen if the URL does not exist..
    }
}

请注意,这将隐藏Invoke-ResetMethod中的所有终止错误。然后,您可以使用if语句查看异常是否为404,然后相应地执行进一步的操作。