2016-09-13 3 views
1

Я пытаюсь запросить строку из Azure Table Storage с помощью REST API и C++, но всегда получаю следующее сообщение об ошибке:Azure Table Service REST API: формат JSON не поддерживается

<?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 также приводит к тому же результату.

Update 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 отклик.

+2

Вместо этого 'headers [" Accept "] =" application/json; odata = verbose ";', используйте 'headers [" Accept "] =" application/json; odata = fullmetadata ";'. Кроме того, я не уверен, почему вы добавляете ''? Я не думаю, что это необходимо. –

+0

@GauravMantri: Изменение заголовка 'Accept', как вы предложили, приводит к такому же результату. Когда я удаляю '' 'часть из запроса' GET', я получил ошибку «ResourceNotFound':« Указанный ресурс не существует ». – deko

+1

Что это за 'sharedAccessSignature' в вашем коде? Это SAS Token? Обратите внимание: если вы используете подпись общего доступа, вам не нужно вычислять/определять заголовок 'Authorization', поскольку информация авторизации включена в ваш токен SAS (' sig'). –

ответ

2

И, наконец, понял!
Вопрос был в моей общей подписке.
Рассматривая это, я нашел sv=2012-02-12 часть и предположил, что это означает версию API. Версия, до Поддержка JSON была введена! Я создал новую общую подпись и, наконец, получил JSON со следующей командой curl.
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>"

Итак, для всех, кто сталкивается с одной и той же проблемой в будущем: сначала проверьте свою подпись!