[英]How to make Invoke-RestMethod GET and PUT requests to Azure table storage using SAS key
這是一個由兩部分組成的問題。 我正在自動化以下任務:a) 需要來自我的 Azure 表的信息和 b) 需要更新我的 Azure 表中的特定實體。 我目前已經能夠通過使用提供的 2 個訪問密鑰中的任何一個來實現這一點,但認為這是一種不安全的做法,並且想要為不同的組定義單獨的策略,因此想要過渡到使用生成的 SAS 密鑰。
a) 我目前可以使用 SAS 策略來檢索整個表並找到我需要的信息,但我認為更好的方法是執行一個單獨的查詢,該查詢只提取與我正在尋找的特定屬性匹配的單個實體(例如 pull與客戶 ID 匹配的實體的所有屬性:“000000001”)。 如何更改我的代碼以完成此操作?
$tableName = "accountTD"
$sasReadToken = '<SAS token here>'
$tableUri = "https://$storageAccount.table.core.windows.net/$tableName$sasReadToken"
$GMTTime = (Get-Date).ToUniversalTime().toString('R')
$header = @{
'x-ms-date' = $GMTTime;
Accept = 'application/json;odata=nometadata'
}
$finalResult = Invoke-WebRequest -Uri $tableUri -Headers $header -UseBasicParsing
$finalResult = $finalResult.Content | ConvertFrom-Json
$finalResult.value
b) 我還需要更新表中的相同實體,但似乎無法弄清楚如何使用我生成的 SAS 密鑰對其進行授權。 我不確定是否使用 Invoke-WebRequest 或 Invoke-RestMethod 或如何處理它們中的任何一個。 這是我迄今為止根據我的研究所做的。
function addUpdateEntity ($tableName, $PartitionKey, $RowKey, $entity){
$sasReadToken = '<SAS token here>'
$resource = "$tableName(PartitionKey='$PartitionKey',RowKey='$Rowkey')"
$tableUri = "https://$storageAccount.table.core.windows.net/$tableName$sasReadToken"
$GMTTime = (Get-Date).ToUniversalTime().toString('R')
$header = @{
'x-ms-date' = $GMTTime;
Accept = 'application/json;odata=nometadata'
}
$body = $entity | ConvertTo-Json
$item = Invoke-RestMethod -Method PUT -Uri $tableUri -Headers $headers -Body $body -ContentType application/json
}
$mBody = @{
PartitionKey = "MPS02000"
RowKey = "2019-000101"
appUpdateMode = "1"
m_CustID = "000000001"
}
addUpdateEntity -TableName "atdMachines" -PartitionKey $mBody.PartitionKey -RowKey $mBody.RowKey -entity $mBody
一季度。 拉取與客戶 ID 匹配的實體的所有屬性
答:您可以使用$filter
查詢表達式。 例如,我的testTable
有 2 個實體:
我可以通過發出如下請求來獲取Id
等於00001
的實體:
獲取https://storagetest789.table.core.windows.net/testTable?{sastoken}&$filter=(Id eq '00001')
$storageAccount = "storagetest789"
$tableName = "testTable"
$sasReadToken = "?sv=2019-02-02&ss=t&sr***************D"
$filter = "`$filter=(Id eq '00001')"
$tableUri = "https://$storageAccount.table.core.windows.net/$tableName$sasReadToken&$filter"
$GMTTime = (Get-Date).ToUniversalTime().toString('R')
$header = @{
'x-ms-date' = $GMTTime;
Accept = 'application/json;odata=nometadata'
}
$finalResult = Invoke-WebRequest -Uri $tableUri -Headers $header -UseBasicParsing
$finalResult = $finalResult.Content | ConvertFrom-Json
$finalResult.value
結果:
Q2。 更新表中的同一實體
答: Invoke-WebRequest
和Invoke-RestMethod
都適合在這里Invoke-RestMethod
HTTP 請求。 我在您的腳本中發現了一些錯誤,這是已修復的錯誤:
function addUpdateEntity ($tableName, $PartitionKey, $RowKey, $entity){
$storageAccount = "storagetest789"
$tableName = "testTable"
# Need write access
$sasWriteToken = "?sv=2019-02-02&ss=t&s*****************************D"
$resource = "$tableName(PartitionKey='$PartitionKey',RowKey='$Rowkey')"
# should use $resource, not $tableNmae
$tableUri = "https://$storageAccount.table.core.windows.net/$resource$sasWriteToken"
# should be headers, because you use headers in Invoke-RestMethod
$headers = @{
Accept = 'application/json;odata=nometadata'
}
$body = $entity | ConvertTo-Json
$item = Invoke-RestMethod -Method PUT -Uri $tableUri -Headers $headers -Body $body -ContentType application/json
}
$mBody = @{
PartitionKey = "p1"
RowKey = "r1"
Id = "00001"
Value = "new value"
}
addUpdateEntity -TableName "atdMachines" -PartitionKey $mBody.PartitionKey -RowKey $mBody.RowKey -entity $mBody
結果:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.