I'm trying to execute Azure Table Storage API
using Powershell Invoke-RestMethod
but it returns 415 error.
Here's Powershell code:
$accessKey = "accesskey"
$account_name = "storage account"
$table_name = "table storage"
$date = "Fri, 10 Nov 2017 00:47:55 GMT"
$api_version = "2015-12-11"
$table_url = "https://$account_name.table.core.windows.net/$table_name"
$data_type = "application/json"
$signature = "generated signature"
$body = @{
Address="Mountain View";
Age="23"
}
$json = $body | Convertto-JSON
$table_headers = @{
"x-ms-date" = $date
"x-ms-version" = $api_version
"Authorization" = "SharedKey $account_name`:$signature"
"Content-Type" = $data_type
}
Invoke-RestMethod -Method POST -Uri $table_url -Headers $table_headers -Body $json -Verbose
Remote server retunrned error:
詳細: GET https://preprodtelemaapim.management.azure-api.net/reports/byApi?api-version=2017-03-01&$filter=timestamp+ge+datetime'2017-10-16T00:00:00'+and+timestamp+le+datetime'2017-10-17T00:00:00' with 0-byte payload 詳細: received 4841-byte response of content type application/json; charset=utf-8 詳細: POST https://telemaapimlog.table.core.windows.net/reporttable with -1-byte payload Invoke-RestMethod : リモート サーバーがエラーを返しました*: (415) Unsupported Media Type 発生場所 C:\Users\sasaki.hikaru\Desktop\repot.ps1:83 文字:1 + Invoke-RestMethod -Method POST -Uri $table_url -Headers $table_headers -Body $js ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod]、WebException + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
I have read some similar problems in this site but they are no content-type or json description issues mostly so I assume that there are no problems in my code.
Anybody have ideas? Please help me.
Interesting problem. The reason you're getting this error is because you have not specified the format of response data i.e value for Accept
request header. Because you have not specified this value, storage service treats its value as XML which is not supported for the storage service version that you have specified.
Once you include this Accept
header (and specify value for PartitionKey and RowKey in your $body
), things should work just fine.
Here's the code that I wrote:
$accessKey = "account key"
$account_name = "account name"
$table_name = "table name"
$date = ([System.DateTime]::Now).ToString("R")
$api_version = "2016-05-31"
$table_url = "https://$account_name.table.core.windows.net/$table_name"
$data_type = "application/json"
$canonicalResource = "/$account_name/$table_name";
$stringToSign = "POST`n`n$data_type`n$date`n$canonicalResource";
$utf8enc = [System.Text.Encoding]::UTF8;
$bytes = $utf8enc.GetBytes($stringToSign)
$hmacsha = New-Object System.Security.Cryptography.HMACSHA256
$hmacsha.key = [System.Convert]::FromBase64String($accessKey)
$signature = [System.Convert]::ToBase64String($hmacsha.ComputeHash([Text.Encoding]::UTF8.GetBytes($stringToSign)))
$body = @{
PartitionKey = "1";
RowKey = [System.guid]::NewGuid().ToString();
Address="Mountain View";
Age="23";
}
$json = $body | Convertto-JSON
$table_headers = @{
"x-ms-date" = $date
"x-ms-version" = $api_version
"Authorization" = "SharedKey $account_name`:$signature"
"Content-Type" = $data_type
"Accept" = "application/json;odata=fullmetadata"
}
Invoke-RestMethod -Method POST -Uri $table_url -Headers $table_headers -Body $json -Verbose