Powershell Invoke RestMethod error 415 Unsupported Media Type

ssk3 picture ssk3 · Nov 10, 2017 · Viewed 7.6k times · Source

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.

Answer

Gaurav Mantri picture Gaurav Mantri · Nov 10, 2017

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