2017-11-07 11 views
0

テーブルストレージサービスでインセットテーブルエンティティREST APIを実行したいが、動作しません。AzureテーブルサービスREST APIエラー

私はthis docを参照しました。

私の要求コードはここにある

<?php 
// storage account name 
$account = "mystgaccount"; 
$tablestoragename = "mytablename"; 
$accessKey = "myaccesskey"; 
$date = gmdate('D, d M Y H:i:s T',time()); 
$api_version = "2015-12-11"; 
$url = "https://$account.table.core.windows.net/$tablestoragename"; 
$method = "POST"; 
$body = '{"Address":"MountainView","Age":23,"AmountDue":200.23,"[email protected]":"Edm.Guid","CustomerCode":"c9da6455-213d-42c9-9a793e9149a57833","[email protected]":"Edm.DateTime","CustomerSince":"2008-0710T00:00:00","IsActive":true,"[email protected]":"Edm.Int64","NumberOfOrders":"255","PartitionKey":"mypartitionkey","RowKey":"myrowkey"}'; 

$stringToSign = [ 
// VERB 
$method, 
// Content-MD5 
'', 
// Content-Type 
'', 
// Date 
$date, 
]; 

$stringToSign = array_merge($stringToSign, ["/$account/$tablestoragename"]); 
$stringToSign = implode("\n", $stringToSign); 
$signature = base64_encode(hash_hmac('sha256', $stringToSign, base64_decode($accessKey), true)); 

$headers = [ 
"x-ms-date:{$date}", 
"x-ms-version:$api_version", 
"Authorization:SharedKey $account:{$signature}", 
"Content-Type: application/json", 
]; 

$ch = curl_init(); 

$options = array(
CURLOPT_URL => $url, 
CURLOPT_HTTPHEADER => $headers, 
CURLOPT_CUSTOMREQUEST => $method, 
CURLOPT_SSL_VERIFYPEER => FALSE, 
CURLOPT_RETURNTRANSFER => TRUE, 
CURLOPT_POSTFIELDS => http_build_query($body), 
); 

curl_setopt_array($ch, $proxy_options); 
curl_setopt_array($ch, $options); 

$response = curl_exec($ch); 
var_dump($response); 
echo curl_error($ch); 
curl_close($ch); 

?> 

応答

"<?xml version="1.0" encoding="utf-8"?><m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"><m:code>AuthenticationFailed</m:code><m:message xml:lang="en-US">Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. 
RequestId:b93fe560-0002-0028-129a-571361000000 
Time:2017-11-07T07:34:13.3303714Z</m:message></m:error>"  

私は関連の質問を読んで、それはまだ解決していない:(

をあなたが任意のアイデアを持っていますか?

+0

AuthenticationFailed:間違ったアカウントデータですか? – KimKulling

+0

返事ありがとう、Kim。私は自分の口座を確認したが間違っていない。 – ssk3

答えて

0

このエラーの原因としては、Content-Type heade r。リクエストにこのヘッダーを指定していますが、$stringToSignには含まれていません。 $stringToSignを次のように変更してもう一度お試しください。

$stringToSign = [ 
// VERB 
$method, 
// Content-MD5 
'', 
// Content-Type 
'application/json', 
// Date 
$date, 
]; 
+0

こんにちはGaurav、あなたの返信に感謝します。 Content-Typeを署名に追加しましたが、別のエラーがあります。 msgstr "リクエスト入力の1つが有効ではありません。"身体に問題があることを意味しますか? – ssk3

+0

間違いを発見しました。本体jsonはすでにエンコードされていたので、http_build_queryは必要ありません。誰もありがとう、それは動作します! – ssk3

関連する問題