如何使用SAS键使Invoke RestMethod获取并将请求放入Azure表存储

如何使用SAS键使Invoke RestMethod获取并将请求放入Azure表存储,azure,powershell,rest,api,Azure,Powershell,Rest,Api,这是一个由两部分组成的问题。我正在自动化任务,这些任务a)需要来自Azure表的信息,b)需要更新Azure表中的特定实体。我目前已经能够通过使用提供的两个访问密钥中的任何一个来实现这一点,但我认为这是一种不安全的做法,我希望为不同的组定义单独的策略,因此我希望过渡到使用生成的SAS密钥 a) 目前,我可以使用SAS策略检索整个表并查找所需的信息,但我认为更好的方法是执行单个查询,只提取与我正在查找的特定属性匹配的单个实体(例如,提取与客户ID匹配的实体的所有属性:“00000000 1”)。如

这是一个由两部分组成的问题。我正在自动化任务,这些任务a)需要来自Azure表的信息,b)需要更新Azure表中的特定实体。我目前已经能够通过使用提供的两个访问密钥中的任何一个来实现这一点,但我认为这是一种不安全的做法,我希望为不同的组定义单独的策略,因此我希望过渡到使用生成的SAS密钥

a) 目前,我可以使用SAS策略检索整个表并查找所需的信息,但我认为更好的方法是执行单个查询,只提取与我正在查找的特定属性匹配的单个实体(例如,提取与客户ID匹配的实体的所有属性:“00000000 1”)。如何更改代码以实现这一点

$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 
$tableName=“accountTD”
$sasReadToken=''
$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=调用WebRequest-Uri$tableUri-Headers$header-UseBasicParsing
$finalResult=$finalResult.Content |从Json转换
$finalResult.value
b) 我还需要更新表中的同一实体,但似乎不知道如何使用生成的SAS密钥对其进行授权。我不确定是使用InvokeWebRequest还是InvokeRestMethod,也不确定如何进行这两种操作。以下是我根据研究得出的结论

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
函数addUpdateEntity($tableName、$PartitionKey、$RowKey、$entity){
$sasReadToken=''
$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 |转换为Json
$item=Invoke RestMethod-Method PUT-Uri$tableUri-Headers$Headers-Body$Body-ContentType应用程序/json
}
$mBody=@{
PartitionKey=“MPS02000”
RowKey=“2019-000101”
appUpdateMode=“1”
m_CustID=“00000000 1”
}
addUpdateEntity-TableName“atdMachines”-PartitionKey$mBody.PartitionKey-RowKey$mBody.RowKey-entity$mBody

Q1。提取与客户ID匹配的实体的所有属性

答:您可以使用
$filter
查询表达式。例如,我的
测试表中有2个实体:

我可以通过如下请求获得
Id
等于
00001
的实体:

获取
https://storagetest789.table.core.windows.net/testTable?{sastoken}&$filter=(Id eq'00001')

结果:

问题2。更新表中的相同实体

答:
Invoke-WebRequest
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
结果:


您不使用SDK有什么原因吗?这就是我目前试图避免使用的方法,除非出于我任务的目的没有其他选择。相信我,如果可以的话,我会使用SDK。你能看看我的答案吗?这是有帮助的,你可以把它标记为答案,这将进一步帮助其他人。谢谢
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