本文介绍了Azure存储表REST Api调用-无效的标题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试调用REST API以查看Azure存储表的内容.希望我已经正确地形成了Authorization标头值,并且得到了以下错误.请更正我在以下请求中缺少的位置(来自REST Client应用程序).

I am trying to invoke the REST API to view the content of Azure Storage table.Hope I have properly formed Authorization header value and I am getting below error. Please correct me where I am missing in below request (From REST Client app).

{
  "method": "GET",
  "transformRequest": [
    null
  ],
  "transformResponse": [
    null
  ],
  "url": "https://#####.table.core.windows.net/testDB",
  "headers": {
    "x-ms-date": "Thu, 28 Jun 2018 08:39:05 GMT",
    "x-ms-version": "2018-06-28",
    "Accept": "application/json;odata=nometadata",
    "Authorization": "SharedKeyLite #####:########"
  },
  "data": "",
  "timeout": {}
}

这是我的回复标题:

{
  "x-ms-request-id": "3fc23b14-2002-0037-04bc-0e9e56000000",
  "date": "Thu, 28 Jun 2018 08:46:39 GMT",
  "server": "Microsoft-HTTPAPI/2.0",
  "content-length": "371",
  "content-type": "application/xml",
  "status": 400
}

和响应正文

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
  <code>InvalidHeaderValue</code>
  <message xml:lang="en-US">The value for one of the HTTP headers is not in the correct format.
RequestId:3fc23b14-2002-0037-04bc-0e9e56000000
Time:2018-06-28T08:46:40.1148690Z</message>
</error>

这是我用来生成SignatureString的JAVA代码

Here is the JAVA code, I used to generate SignatureString

    private void printHash()
    {
//        https://mytestaccount.table.core.windows.net/testDB: this is the url form Azure portal displaying next to table
        String secret = "I Updated my key here";
// Date for string to sign
        Calendar calendar = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss 'GMT'", Locale.US);
        sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
        String date = sdf.format(calendar.getTime());
// canonicalizedResource, such as "/testaccount1/Tables"
        String canonicalizedResource = "/testDB";
        String stringToSign = date + "\n" + canonicalizedResource;
        System.out.println(stringToSign);
// HMAC-SHA@%^
        Mac sha256HMAC = null;
        try {
            sha256HMAC = Mac.getInstance("HmacSHA256");
            SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
            sha256HMAC.init(secretKey);
            String hash = Base64.encodeToString(sha256HMAC.doFinal(stringToSign.getBytes()), Base64.DEFAULT);
            System.out.println(hash);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        }
}

推荐答案

要修复的四点:

    如果要以application/json;odata=nometadata的形式获取内容,则
  1. x-ms-version不是可选的. x-ms-version应该明确设置为2013-08-15或更高版本(最新版本为 2018-03-28 )以支持此格式.请参阅表服务中的Json格式.
  2. 日期格式应为EEE, dd MMM yyyy HH:mm:ss 'GMT'.用两位数表示Day.
  3. canonicalizedResource应该像您的代码注释一样为storageAccountName\tableName.
  4. 要生成SecretKeySpec,请SecretKeySpec secretKey = new SecretKeySpec(Base64.decode(secret), "HmacSHA256");因为该秘密被编码为Base64.
  1. x-ms-version is not optional if you want get content as application/json;odata=nometadata. x-ms-version should be set explicitly to 2013-08-15 or later(The latest is 2018-03-28) to support this format. See Json format in table service.
  2. Date Format should be EEE, dd MMM yyyy HH:mm:ss 'GMT'. Two digits to express Day.
  3. canonicalizedResource should be storageAccountName\tableName like your code remark.
  4. To generate SecretKeySpec, SecretKeySpec secretKey = new SecretKeySpec(Base64.decode(secret), "HmacSHA256"); Because the secret is encoded as Base64.

这篇关于Azure存储表REST Api调用-无效的标题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-23 20:27