我正在尝试使用REST API和PowerShell管理CosmosDB资源。 当我使用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
...
以及使用新URI(现在包括要更改的SP名称)的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
哪个抛出了我401 Unauthorized
,所以auth标头似乎不正确。无法弄清楚我该在那里更改。
答案 0 :(得分:0)
答案 1 :(得分:0)
所以关键是要这样改变变量:
$ResourceType = "sprocs"
$ItemName = "SP_Name"
$ResourceLink = "dbs/$DBName/colls/$CollName/$ResourceType/$ItemName"
,然后生成身份验证标头。 即资源链接变量必须包含替换对象的完整路径。