REST-запрос Powershell не вернет ответ сервера, если 404 - PullRequest
0 голосов
/ 13 ноября 2018

Я все еще новичок в Powershell и не смог ничего найти по этому поводу. Я выполняю запрос REST GET на URI, который, как я знаю, возвращает 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 голосов
/ 13 ноября 2018

Вы должны использовать попытку ... поймать.

$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 '-----------------------'
}
0 голосов
/ 13 ноября 2018

Вы можете подавить сообщение об ошибке через 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, а затем выполнить дальнейшие действия соответственно.

...