如何使用 Postman 向 Azure Table REST API 发送查询
How to send a query to Azure Table REST API with Postman
我正在尝试使用 Postman 向 Azure Table REST API 发出 GET 请求。
我可以使用我找到的 C# 程序发出工作请求,但是当我尝试将相同的信息复制到 Postman 请求时 return 出现以下错误:
Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
使用 C# 程序生成我的 UTC 时间和我的授权码。
该程序将给我以下输出:
x-ms-date: Fri, 01 Nov 2019 10:13:26 GMT
Authorization: SharedKeyLite username:e4IREMOVEDSOMELETTERST4Ag=
Request URI: https://username.table.core.windows.net/MainTable(PartitionKey='akey',RowKey='130')
生成的输出在 C# 程序中有效,因为当我使用时:
result = await Client.GetAsync(requestUri);
结果会给我(akey, 130)的信息。
当我将它们传递给邮递员时,它仍然会给我一个错误。
每当我创建新的授权字符串时,我都会更新邮递员中的日期。
我的邮递员设置如下:
我最终想用 ESP32 发出这个请求,所以它可能有点不相关,但 ESP 给了我同样的错误。任何有关为 Postman 或 ESP 正确设置 headers 的提示都将受到赞赏。
要使这项工作首先在您的环境中创建两个变量:
{{utcDate}}
{{authToken}}
然后创建一个新的 Get 请求并像这样设置您的 header:
x-ms-version 2015-12-11
x-ms-date {{utcDate}}
Authorization SharedKey resourceName:{{authToken}}
DataServiceVersion 3.0;NetFx
MaxDataServiceVersion 3.0;NetFx
Accept application/json;odata=nometadata
最后,定义一个Pre-request脚本:
var now = new Date().toUTCString();
pm.environment.set("utcDate", now);
var hcar = "/resourceName/TableName";
var verb = request.method;
var cntMd5 = "";
var cntType = "";
var mKey="<Your service key goes here>";
var text = verb + "\n" + (cntMd5 || "") + "\n" + (cntType || "") + "\n" + now + "\n" + hcar;
var key = CryptoJS.enc.Base64.parse(mKey);
var signature = CryptoJS.HmacSHA256(text, key);
var base64Bits = CryptoJS.enc.Base64.stringify(signature);
pm.environment.set("authToken", base64Bits);
变量的原因是,authToken 因为您需要一个占位符来存储计算出的令牌,utcDate 因为必须使用 header 中的相同日期来计算您的令牌。
我发现问题出在 Postman 本身。
自动 URL 编码正在进行 issue。
当我直接转到 MainTable 时,Mauricio 的代码起作用了。
我正在尝试使用 Postman 向 Azure Table REST API 发出 GET 请求。 我可以使用我找到的 C# 程序发出工作请求,但是当我尝试将相同的信息复制到 Postman 请求时 return 出现以下错误:
Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
使用 C# 程序生成我的 UTC 时间和我的授权码。 该程序将给我以下输出:
x-ms-date: Fri, 01 Nov 2019 10:13:26 GMT
Authorization: SharedKeyLite username:e4IREMOVEDSOMELETTERST4Ag=
Request URI: https://username.table.core.windows.net/MainTable(PartitionKey='akey',RowKey='130')
生成的输出在 C# 程序中有效,因为当我使用时:
result = await Client.GetAsync(requestUri);
结果会给我(akey, 130)的信息。 当我将它们传递给邮递员时,它仍然会给我一个错误。 每当我创建新的授权字符串时,我都会更新邮递员中的日期。
我的邮递员设置如下:
我最终想用 ESP32 发出这个请求,所以它可能有点不相关,但 ESP 给了我同样的错误。任何有关为 Postman 或 ESP 正确设置 headers 的提示都将受到赞赏。
要使这项工作首先在您的环境中创建两个变量:
{{utcDate}}
{{authToken}}
然后创建一个新的 Get 请求并像这样设置您的 header:
x-ms-version 2015-12-11
x-ms-date {{utcDate}}
Authorization SharedKey resourceName:{{authToken}}
DataServiceVersion 3.0;NetFx
MaxDataServiceVersion 3.0;NetFx
Accept application/json;odata=nometadata
最后,定义一个Pre-request脚本:
var now = new Date().toUTCString();
pm.environment.set("utcDate", now);
var hcar = "/resourceName/TableName";
var verb = request.method;
var cntMd5 = "";
var cntType = "";
var mKey="<Your service key goes here>";
var text = verb + "\n" + (cntMd5 || "") + "\n" + (cntType || "") + "\n" + now + "\n" + hcar;
var key = CryptoJS.enc.Base64.parse(mKey);
var signature = CryptoJS.HmacSHA256(text, key);
var base64Bits = CryptoJS.enc.Base64.stringify(signature);
pm.environment.set("authToken", base64Bits);
变量的原因是,authToken 因为您需要一个占位符来存储计算出的令牌,utcDate 因为必须使用 header 中的相同日期来计算您的令牌。
我发现问题出在 Postman 本身。 自动 URL 编码正在进行 issue。 当我直接转到 MainTable 时,Mauricio 的代码起作用了。