Azure表服务REST API:不支持JSON格式



我正在尝试使用REST API和c++从Azure表存储请求一行,但总是得到以下错误:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
  <cod_e>JsonFormatNotSupported</cod_e>
  <message xml:lang="en-US">JSON format is not supported.
RequestId:0ccb3b9b-0002-0029-3389-0d2fa1000000
Time:2016-09-13T06:39:13.3155742Z</message>
</error>

这是我的请求:

GET https://<myaccount>.table.core.windows.net/<mytable>(PartitionKey='<mypartition>',RowKey='<myrow>')?<sharedsignature>

下面是我如何填写请求头,从https://msdn.microsoft.com/en-us/library/dd179428.aspx:

std::string sharedAccessSignature("<sharedsignature>");
std::string dateTime(GetDateTime());
std::string stringToSign(dateTime + "n/" + account + "/" + "<mytable>");
std::string request("(PartitionKey='<mypartition>',RowKey='<myrow>')");
stringToSign += request;
std::string signatureString(HMACSHA256(stringToSign, sharedAccessSignature));
headers["Authorization"] = "SharedKeyLite " + account + ":" + signatureString;
headers["DataServiceVersion"] = "3.0;NetFx";
headers["MaxDataServiceVersion"] = "3.0;NetFx";
headers["x-ms-version"] = "2015-12-11";
headers["x-ms-date"] = dateTime;
headers["Accept"] = "application/json;odata=verbose";
headers["Accept-Charset"] = "UTF-8";

表已存在且不为空。
请告诉我出了什么问题?

更新1
从请求中删除sharedsignature,即GET https://<myaccount>.table.core.windows.net/<mytable>(PartitionKey='<mypartition>',RowKey='<myrow>')会导致相同的结果。
从请求中删除Authorization头也会导致相同的结果。

更新2
https://<myaccount>.table.core.windows.net/<mytable>(PartitionKey='<mypartition>',RowKey='<myrow>')?<sharedsignature>放在浏览器中会产生一个有效的响应,但是是Atom格式。

<?xml version="1.0" encoding="utf-8"?>
<entry 
  xml:base="https://<myaccount>.table.core.windows.net/" 
  xmlns="http://www.w3.org/2005/Atom" 
  xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" 
  xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" 
  m:etag="W/&quot;datetime'2016-09-13T05%3A29%3A51.211538Z'&quot;">
  <id>https://<myaccount>.table.core.windows.net/<mytable> (PartitionKey='<mypartition>',RowKey='<myrow>')</id>
  <category term="<myaccount>.<mytable>" scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" />
  <link rel="edit" title="<mytable>" href="<mytable> (PartitionKey='<mypartition>',RowKey='<myrow>')" />
  <title />
  <updated>2016-09-13T11:25:19Z</updated>
  <author><name /></author>
  <content type="application/xml">
    <m:properties>
      <d:PartitionKey><mypartition></d:PartitionKey>
      <d:RowKey><myrow></d:RowKey>
      <d:Timestamp m:type="Edm.DateTime">2016-09-13T05:29:51.211538Z</d:Timestamp>
      <d:Score m:type="Edm.Int32">1050</d:Score>
    </m:properties>
  </content>
</entry>

更新3
使用curl的调查情况,我发现将Accept: application/json;odata=fullmetadata添加到请求头会导致上面的错误。标头中的默认Accept */*生成有效的Atom响应。

终于找到了!
问题在我的共享签名里。
在查看它时,我发现sv=2012-02-12部分,并假设它意味着API版本。在 JSON支持之前的版本被引入!我创建了一个新的共享签名,最后用curl命令得到了JSON。
curl -v -H "Accept: application/json;odata=nometadata" -H "x-ms-version: 2015-12-11" "https://<myaccount>.table.core.windows.net/<mytable>(PartitionKey='<mypartition>',RowKey='<myrow>')?<mysharedsignature>"

所以,对于未来面临同样问题的每个人:请先检查你的签名!

相关内容

  • 没有找到相关文章

最新更新