Ошибка PowerShell Invoke-WebRequest с API Go Daddy

Следуя сценарию (отсюда), который предложили многие другие, работает нормально, у меня возникла ошибка, которая просто вне моей способности понять. Я новичок в Power Shell и только начинаю с API.

Сценарий:

$domain = 'example.com'                    # your domain
$name = 'xyz'                              # name of the A record to update
$key = 'myKey                              # key for godaddy developer API
$secret = 'mySecret'                       # Secret for godday developer API

$headers = @{}
$headers["Authorization"] = 'sso-key ' + $key + ':' + $secret
$result = Invoke-WebRequest https://api.godaddy.com/v1/domains/$domain/records/A/$name -method get -headers $headers
$content = ConvertFrom-Json $result.content
$dnsIp = $content.data

# Get public ip address
$currentIp = Invoke-RestMethod http://ipinfo.io/json | Select -exp ip

# THE CODE WORKS FINE UP TO HERE

if ( $currentIp -ne $dnsIp) {
    $Request = @{ttl=3600;data=$currentIp }
    $JSON = Convertto-Json $request

# THE FOLLOWING LINE FAILS WITH THE ERROR NOTED BELOW

    Invoke-WebRequest https://api.godaddy.com/v1/domains/$domain/records/A/$name -method put -headers $headers -Body $json -ContentType "application/json"
} 

Следующая ошибка возвращается для окончательного Invoke-WebRequest:

Invoke-WebRequest : {"code":"INVALID_BODY","fields":[{"code":"UNEXPECTED_TYPE","message":"is not a array","path":"records"}],"message":"Request body doesn't fulfill schema, see details in `fields`"}
At C:\tfsCode\tfs\api.ps1:25 char:5
+     Invoke-WebRequest https://api.godaddy.com/v1/domains/$domain/reco ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

Справочная страница Go Daddy для Get API находится здесь и для API Put находится здесь.


person Alan    schedule 05.04.2019    source источник


Ответы (1)


В документации PUT API говорится, что тело должно быть массивом. Об этом также говорится в сообщении об ошибке. Попробуйте изменить эту строку:

$Request = @{ttl=3600;data=$currentIp }

to

$Request = @(@{ttl=3600;data=$currentIp })

@() создает массив в PowerShell, при преобразовании в JSON он все равно будет массивом

@{} создает хэш-таблицу в PowerShell, при преобразовании в JSON это будет объект

person Nick Graham    schedule 05.04.2019
comment
Немного короче: $Request = ,@{ttl=3600;data=$currentIp } (+1) - person ; 06.04.2019
comment
Это было тонко, и я глубоко признателен за помощь. Работал отлично. Это заставляет меня задаться вопросом, как исходный код работал для других. - person Alan; 06.04.2019