Azure: удаление таблицы с помощью API-интерфейса REST Azure не работает, если сделано в соответствии с документацией - PullRequest
0 голосов
/ 15 мая 2018

Я следую документации REST Azure для хранения таблиц: Удалить таблицу , Создать таблицу , Аутентификация для служб хранения Azure .Я могу создать таблицу только после удаления заголовка «Content-Length», который, как ни удивительно, помечен как обязательный и включает «x-ms-version».Этого я мог добиться после нескольких проб и ошибок для включения заголовков.

Аналогичная проблема, с которой я сталкиваюсь при удалении.Я не могу удалить таблицу с помощью REST, если строго следую документации.Я попытался несколько проб и ошибок, но это не помогло в случае удаления.

Ниже приведен фрагмент кода для создания и удаления таблицы.

//Input your Storage Account and access-key associated to it.
const yourStorageAccountName = '';
const accessKeyStorageAccount = '';
const Client = require('node-rest-client').Client;
const crypto = require("crypto");

async function createTable() {
    let now = new Date();
    let nowUTC = now.toUTCString();
    let contentType = "application/json";
    // construct input value
    let stringToSign = `POST\n\n${contentType}\n${nowUTC}\n/${yourStorageAccountName}/Tables`;
    let accesskey = accessKeyStorageAccount;
    // create base64 encoded signature
    let key = new Buffer(accesskey, "base64");
    let hmac = crypto.createHmac("sha256", key);
    hmac.update(stringToSign);
    let sig = hmac.digest("base64");
    console.log("SIGNATURE : " + sig);
    let args = {
        headers: {
            "Authorization": "SharedKey " + yourStorageAccountName + ":" + sig,
            "Content-Type": contentType,
            "Accept": "application/json;odata=nometadata",
            "x-ms-version": "2015-12-11",
            "Date": nowUTC,
            "DataServiceVersion": '3.0',
            "MaxDataServiceVersion": '3.0'
        },
        data: {
            "TableName": "fortwo"
        }
    };
    let restClient = new Client();
    restClient.post(`https://${yourStorageAccountName}.table.core.windows.net/Tables`, args, function (data, response) {
        console.log(data);
        //console.log(response);
    });

}

async function deleteTable() {
    let now = new Date();
    let nowUTC = now.toUTCString();
    let contentType = "application/json"
    // construct input value
    let stringToSign = `DELETE\n\n${contentType}\n${nowUTC}\n/${yourStorageAccountName}/Tables(%27fourtwo%27)`;
    let accesskey = accessKeyStorageAccount;
    // create base64 encoded signature
    let key = new Buffer(accesskey, "base64");
    let hmac = crypto.createHmac("sha256", key);
    hmac.update(stringToSign);
    let sig = hmac.digest("base64");
    console.log("SIGNATURE : " + sig);
    console.log("nowutc : " + nowUTC);
    let args = {
        headers: {
            "Authorization": "SharedKey " + yourStorageAccountName + ":" + sig,
            "Content-Type": contentType,
            "Accept": "application/json;odata=nometadata",
            "Date": nowUTC,
            "x-ms-version": "2015-12-11",
            "DataServiceVersion": '3.0',
            "MaxDataServiceVersion": '3.0'
        }
    };
    let restClient = new Client();
    restClient.delete(`https://${yourStorageAccountName}.table.core.windows.net/Tables('fourtwo')`, args, function (data, response) {
        console.log(data);
        //console.log(response);
    });
}

async function getTableAcl() {
    let now = new Date();
    let nowUTC = now.toUTCString();
    let contentType = "application/json"
    // construct input value
    let stringToSign = `GET\n\n\n${nowUTC}\n/${yourStorageAccountName}/goodwa\ncomp:acl`;
    let accesskey = accessKeyStorageAccount;
    // create base64 encoded signature
    let key = new Buffer(accesskey, "base64");
    let hmac = crypto.createHmac("sha256", key);
    hmac.update(stringToSign);
    let sig = hmac.digest("base64");
    console.log("SIGNATURE : " + sig);
    console.log("nowutc : " + nowUTC);
    let args = {
        headers: {
            "Authorization": "SharedKey " + yourStorageAccountName + ":" + sig,
            "Date": nowUTC,
            "x-ms-version": "2015-12-11"
        }
    };
    let restClient = new Client();
    restClient.get(`https://${yourStorageAccountName}.table.core.windows.net/goodwa?comp=acl`, args, function (data, response) {
        console.log(JSON.stringify(data));
        //console.log(response);
    });
}


//createTable()
//deleteTable()
getTableAcl()

То же поведение применяется для GetТаблица ACL .

Я что-то упускаю в обоих случаях?Я в порядке с обходным путем, который я использую для создания.Возможен ли обходной путь для удаления, а также Получить таблицу ACL ?

Прикрепление ниже снимка экрана запроса на удаление через rest-клиент Postman.Delete Table via Rest client.

Delete Table via Rest client with headers as suggested by Gaurav Mantri.

Delete Table via Rest client with different header combination.

Вверху Остальные вызовы IЯ использую подпись, рассчитанную во фрагменте кода.

1 Ответ

0 голосов
/ 16 мая 2018

Большая часть вашего кода верна, за исключением одной незначительной вещи (и я извиняюсь за указание удалить заголовок с типом содержимого). По сути, в вашем inputvalue путь ресурса должен быть закодирован в URL. Таким образом, ваш inputvalue должен быть:

let inputvalue = `DELETE\n\napplication/json\n${nowUTC}\n/${yourStorageAccountName}/Tables(%27mytab%27)`;

Escape ' с %27 т.е. заменить 'mytab' на %27mytab%27, и вы не должны получить ошибку 403.

Вот код, который я использовал:

function deleteTable() {
    let now = new Date();
    let nowUTC = now.toUTCString();
    // construct input value
    let inputvalue = `DELETE\n\napplication/json\n${nowUTC}\n/${yourStorageAccountName}/Tables(%27mytab%27)`;
    console.log('inputvalue');
    console.log(inputvalue)
    let accesskey = accessKeyStorageAccount;
    // create base64 encoded signature
    let key = new Buffer(accesskey, "base64");
    let hmac = crypto.createHmac("sha256", key);
    hmac.update(inputvalue);
    let sig = hmac.digest("base64");
    console.log("SIGNATURE : " + sig);
    let args = {
        headers: {
            "Authorization": "SharedKey " + yourStorageAccountName + ":" + sig,
            "Content-Type": "application/json",
            "Accept": "application/json;odata=nometadata",
            "x-ms-version": "2015-12-11",
            "x-ms-date": nowUTC,
            "DataServiceVersion": '3.0',
            "MaxDataServiceVersion": '3.0'
        }
    };
    let restClient = new Client();
    restClient.delete(`https://${yourStorageAccountName}.table.core.windows.net/Tables('mytab')`, args, function (data, response) {
        console.log(data);
        console.log(response.statusCode);
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...