Powershell Invoke RestMethod error 415 Unsupported Media Type
Asked Answered
T

1

7

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.

Topdrawer answered 10/11, 2017 at 1:11 Comment(0)
R
11

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
Rehearing answered 10/11, 2017 at 7:2 Comment(1)
I appreciate that you provide code and explain it detailedly, so it works! I think that the azure document which I referred should describe about this problem as a point to notice.Topdrawer

© 2022 - 2024 — McMap. All rights reserved.