#azure #azure-cosmosdb #azure-powershell
#azure #azure-cosmosdb #azure-powershell
Вопрос:
Я пытаюсь управлять ресурсами CosmosDB с помощью REST API и PowerShell. Мой код отлично работает при использовании GET и POST, но когда я пытаюсь заменить существующий объект с помощью PUT, я получаю ошибку 401.
Мой код регистрирует хранимую процедуру, когда она не существует, и должен обновлять ее, когда SP уже существует.
Итак, когда я создаю новый SP, я использую следующие переменные:
$Verb = "POST"
$ResourceType = "sprocs"
$ResourceLink = "dbs/$DBName/colls/$CollName"
$queryUri = "$CosmosDBEndPoint$ResourceLink/$ResourceType"
получить заголовок авторизации:
...
$authHeader = Generate-MasterKeyAuthorizationSignature -verb $Verb -resourceLink $ResourceLink -resourceType $ResourceType -key $MasterKey -keyType "master" -tokenVersion "1.0" -dateTime $dateTime
а затем вызвать метод REST:
$header = @{authorization=$authHeader;"x-ms-version"="2017-02-22";"x-ms-date"=$dateTime}
$contentType= "application/json"
Invoke-RestMethod -Method $Verb -ContentType $contentType -Uri $queryUri -Headers $header -Body $body
Это отлично работает и создает то, что должно.
И, когда мне нужно заменить существующий объект (SP в моем случае), я изменяю переменные следующим образом:
$Verb = "PUT"
$ResourceType = "sprocs"
$ResourceLink = "dbs/$DBName/colls/$CollName"
$ItemName = "SP_Name"
$queryUri = "$CosmosDBEndPoint$ResourceLink/$ResourceType/$ItemName"
сгенерируйте заголовок auth точно так же, как в случае с POST (отличается только глагол):
...
$authHeader = Generate-MasterKeyAuthorizationSignature -verb $Verb -resourceLink $ResourceLink -resourceType $ResourceType -key $MasterKey -keyType "master" -tokenVersion "1.0" -dateTime $dateTime
...
и метод invoke REST с новым URI (который теперь включает имя SP, подлежащее изменению):
$header = @{authorization=$authHeader;"x-ms-version"="2017-02-22";"x-ms-date"=$dateTime}
$contentType= "application/json"
Invoke-RestMethod -Method $Verb -ContentType $contentType -Uri $queryUri -Headers $header -Body $body
Что меня сбивает с толку 401 Unauthorized
, поэтому кажется, что заголовок auth неверен. Не могу понять, что я должен там изменить.
Ответ №1:
Отсюда похоже, что ресурс или значение в ресурсе, которое вы пытаетесь изменить, не поддерживает действие PUT. Вы можете подтвердить вручную;
https://learn.microsoft.com/en-us/rest/api/cosmos-db/
или перейдя к;
Комментарии:
1. На самом деле, это должно: Заменить хранимую процедуру и, похоже, делает.
Ответ №2:
Итак, ключом было изменить переменные таким образом:
$ResourceType = "sprocs"
$ItemName = "SP_Name"
$ResourceLink = "dbs/$DBName/colls/$CollName/$ResourceType/$ItemName"
а затем сгенерируйте заголовок auth.
Т.е. переменная ссылки на ресурс должна содержать полный путь к заменяемому объекту.