PowerShell Invoke-RestMethod выдает ошибку после смены пароля

У меня есть сценарий PowerShell для вызова API. На данный момент это выглядит так:

param( [string]$resultFile, [string]$from, [string]$to)

try {
    $headers = @{'api-key' = '763bcb3d-7b62-4075-877e-03a7cdfbbb4d'}

    $url = 'https://******?query = { calendar(where: {
        and: { from: { gte: "' + $from + '" }, to: { lte: "' + $to + '" } } } )
        {
            concerned
            {
                username
                regime
            }
            id
            status
            from
            to  
            primaryType
            secondaryType    
        }
    }'

    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    Invoke-RestMethod -Uri $url -Method Get -Headers $headers -OutFile $resultFile
}
catch {
    write-output $PSItem.ToString()
    exit 1
}

Что работает нормально. Однако повышенная безопасность означает, что у меня больше не будет постоянного ключа API, и его придется заменять каждые шесть месяцев. Вместо того, чтобы каждый раз изменять свой сценарий, я бы предпочел поместить ключ в конфигурацию пакета SSIS и просто изменить его. Теперь мой скрипт выглядит так:

param( [string]$resultFile, [string]$from, [string]$to, [string]$ApiKey)

try {
    $headers = @{'api-key' = '$ApiKey'}

    $url = 'https://******?query = { calendar(where: {
        and: { from: { gte: "' + $from + '" }, to: { lte: "' + $to + '" } } } )
        {
            concerned
            {
                username
                regime
            }
            id
            status
            from
            to  
            primaryType
            secondaryType    
        }
    }'

    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    Invoke-RestMethod -Uri $url -Method Get -Headers $headers -OutFile $resultFile
}
catch {
    write-output $PSItem.ToString()
    exit 1
}

Я не ожидал каких-либо проблем, поскольку это был всего лишь источник ключа API, который я изменил с жестко запрограммированного на параметр, но я получил это сообщение об ошибке:

E:\temp\hrnet.ps1 : The remote server returned an error: (500) Internal Server Error.
At line:1 char:1
+ E:\temp\hrnet.ps1 E:\temp\HRNet.json 2024-04-15 2024-06-10 acb59383-a ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,hrnet.ps1

Я просмотрел параметры, все выглядит хорошо, но я просто не могу понять, что происходит не так.

Если я верну его обратно, он снова будет работать нормально, поэтому мне интересно, связано ли это как-то с набором символов параметров, но, честно говоря, у меня нет идей о том, в чем проблема и как ее исправить.

Есть ли у кого-нибудь предложения?

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
0
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема, с которой вы столкнулись, скорее всего, связана со способом передачи ключа API в заголовки. В PowerShell, когда вы заключаете строку в одинарные кавычки, подстановка переменных не выполняется. Таким образом, во втором скрипте ключ API передается как литеральная строка $ApiKey вместо значения, содержащегося в переменной $ApiKey.

Вам следует использовать двойные кавычки вместо одинарных кавычек для значения API-ключа в хеш-таблице заголовков, чтобы гарантировать правильное раскрытие переменной. сценарий:

param( [string]$resultFile, [string]$from, [string]$to, [string]$ApiKey)

try {
    $headers = @{'api-key' = $ApiKey}

    $url = 'https://******?query = { calendar(where: {
        and: { from: { gte: "' + $from + '" }, to: { lte: "' + $to + '" } } } )
        {
            concerned
            {
                username
                regime
            }
            id
            status
            from
            to  
            primaryType
            secondaryType    
        }
    }'

    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    Invoke-RestMethod -Uri $url -Method Get -Headers $headers -OutFile $resultFile
}
catch {
    write-output $PSItem.ToString()
    exit 1
}

В этой версии заголовку API-ключа присваивается значение переменной $ApiKey напрямую, без заключения в кавычки.

Дополнительно помните, что при вызове скрипта вы правильно передаете ключ API. .\hrnet.ps1 -resultFile "E:\temp\HRNet.json" - от "2024-04-15" - до "2024-06-10" -ApiKey "acb59383-a..."

Это изменение должно устранить наблюдаемую вами внутреннюю ошибку сервера 500, поскольку ключ API теперь будет правильно включаться в заголовки запросов.

Другие вопросы по теме