У меня есть сценарий 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
Я просмотрел параметры, все выглядит хорошо, но я просто не могу понять, что происходит не так.
Если я верну его обратно, он снова будет работать нормально, поэтому мне интересно, связано ли это как-то с набором символов параметров, но, честно говоря, у меня нет идей о том, в чем проблема и как ее исправить.
Есть ли у кого-нибудь предложения?

Проблема, с которой вы столкнулись, скорее всего, связана со способом передачи ключа 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 теперь будет правильно включаться в заголовки запросов.