2017-11-10 7 views
1

Powershell Invoke-RestMethod을 사용하여 Azure Table Storage API을 실행하려고하지만 415 오류을 반환합니다. 여기 Powershell Invoke RestMethod 오류 415 지원되지 않는 미디어 형식

는 파워 쉘 코드입니다 :

$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 

원격 서버 retunrned 오류 :이 사이트의 일부 유사한 문제를 읽고 있지만, 대부분 그래서 콘텐츠 형식 또는 JSON 설명 문제 없습니다

詳細: 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 내 코드에 문제가 없다고 가정하십시오.

누구나 아이디어가 있습니까? 도와주세요.

답변

1

흥미로운 문제. 이 오류가 발생하는 이유는 응답 데이터의 형식, 즉 Accept 요청 헤더의 값을 지정하지 않았기 때문입니다. 이 값을 지정하지 않았으므로 스토리지 서비스는 사용자가 지정한 스토리지 서비스 버전에서 지원되지 않는 XML 값을 해당 값으로 취급합니다.

Accept 헤더를 포함하고 ($body에 PartitionKey 및 RowKey 값을 지정하면) 정상적으로 작동합니다.

여기에 내가 쓴 코드입니다 :

$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 
+0

난 당신이 코드를 제공하고, 상세한 그것을 설명하는 것이 감사, 그래서 작품! 제가 언급 한 하늘색 문서는이 문제를 주목해야 할 점으로 설명해야한다고 생각합니다. – ssk3