在Azure Cosmos DB中使用REST进行CRUD操作
我正在尝试使用REST对Azure Cosmos DB执行CRUD操作。 根据链接https://docs.microsoft.com/en-us/rest/api/documentdb/create-a-document我创建了我的有效负载并尝试在Opera浏览器中使用Restman进行测试。 以下是我的有效载荷详情 –
头
Authorization *************************** Content-Type application/query+json x-ms-date Tue, 05 Dec 2017 16:49:31 GMT x-ms-session-token Session x-ms-version 2017-02-22
身体
id sg4c828f-31f8-4db4-8e7c-e8bdff222dsg value { "id": "AndersenFamily", "LastName": "Andersen", "Parents": [ { "FamilyName": null, "FirstName": "Thomas" }, { "FamilyName": null, "FirstName": "Mary Kay" } ], "Children": [ { "FamilyName": null, "FirstName": "Henriette Thaulow", "Gender": "female", "Grade": 5, "Pets": [ { "GivenName": "Fluffy" } ] } ], "Address": { "State": "WA", "County": "King", "City": "Seattle" }, "IsRegistered": true }
使用以下代码在C#中生成放入请求头中的auth-token(根据上述链接中的示例) –
string GenerateAuthToken(string verb, string resourceType, string resourceId, string date, string key, string keyType, string tokenVersion) { var hmacSha256 = new System.Security.Cryptography.HMACSHA256 { Key = Convert.FromBase64String(key) }; verb = verb ?? ""; resourceType = resourceType ?? ""; resourceId = resourceId ?? ""; string payLoad = string.Format(System.Globalization.CultureInfo.InvariantCulture, "{0}\n{1}\n{2}\n{3}\n{4}\n", verb.ToLowerInvariant(), resourceType.ToLowerInvariant(), resourceId, date.ToLowerInvariant(), "" ); byte[] hashPayLoad = hmacSha256.ComputeHash(System.Text.Encoding.UTF8.GetBytes(payLoad)); string signature = Convert.ToBase64String(hashPayLoad); return System.Web.HttpUtility.UrlEncode(String.Format(System.Globalization.CultureInfo.InvariantCulture, "type={0}&ver={1}&sig={2}", keyType, tokenVersion, signature)); }
这是如何通过参数 –
GenerateAuthToken("GET", "dbs", "dbs/ToDoList", "Tue, 05 Dec 2017 16:49:31 GMT", PARENT_KEY, "master", "1.0");
所以,当我向URL发出POST请求时 –
https://.documents.azure.com:/dbs/DCEAAA==/colls/DCEAAIcEVAA=/docs
我得到以下回应 –
{“code”:“Unauthorized”,“message”:“输入授权令牌无法提供请求。请检查是否按照协议构建了预期的有效负载,并检查正在使用的密钥。服务器使用了以下有效负载签名:’post \ ndocs \ ndceaaicevaa = \ ntue,05 dec 2017 16:49:31 gmt \ n \ n’\ r \ nActivityId:7565996c-d008-438d-a1e9-744d4871948a,Microsoft.Azure.Documents.Common / 1.19.121.4“}
我不知道这里究竟出了什么问题。 如果有人有任何想法,请告诉我。 如有任何澄清,请告诉我。
编辑:添加下面的Restman截图 –
我跟进你提到的文档创建文档API,并做一个演示来创建带有rest API的documentdb文档。 你可以参考它。 对于其他操作,您可以按照以下代码构造哈希标记。
根据Common Azure Cosmos DB REST请求标头 ,如果我们要创建文档,我们需要准备Header,如下所示
Authorization,x-ms-date,Content-Type,x-ms-version
我们可以从这个文档中获取xm版本。 最新版本是2017-02-22 。
我们可以获得您在本文档中提到的演示代码,关于如何为主令牌构建散列令牌签名,请参阅此文档 。 从文档我们可以知道resourceType可以是"dbs", "colls", "docs".
我们需要创建一个文档 ,所以resourceType = docs
var databaseId = "databaseName"; var collectionId = "collectionName"; var datetime = DateTime.UtcNow.ToString("R"); var verb = "post"; var resourceType = "docs"; // var resourceId = $"dbs/{databaseId}/colls/{collectionId}"; var mastKey = "mastkey value"; var keyType = "master"; var tokenVersion = "1.0"; var authToken = GenerateAuthToken(verb, resourceType, resourceId, datetime, mastKey, keyType, tokenVersion);
我们还需要从上面提到的代码变量日期 时间中获取x-ms-date值
Post https://{documentDBAccount}.documents.azure.com:443/dbs/{databaseName}/colls/{collectionId}/docs
更新:
请使用以下数据作为json正文
{ "id": "sg4c828f-31f8-4db4-8e7c-e8bdff222dsg", "value": { "id": "AndersenFamily", "LastName": "Andersen", "Parents": [ { "FamilyName": null, "FirstName": "Thomas" }, { "FamilyName": null, "FirstName": "Mary Kay" } ], "Children": [ { "FamilyName": null, "FirstName": "Henriette Thaulow", "Gender": "female", "Grade": 5, "Pets": [ { "GivenName": "Fluffy" } ] } ], "Address": { "State": "WA", "County": "King", "City": "Seattle" }, "IsRegistered": true } }
- 在Azure Service Bus中并行处理消息
- AzureWebJobsDashboard配置错误
- Azure October 2012 SDK破坏了UseDevelopmentStorage = true
- SQL Azure自动地理复制是否会自动进行故障转移?
- 您可以在一个Windows Azure实例上部署多个Web应用程序吗?
- Microsoft Azure App Service存储
- 无法将REST API用于Windows Server 1.1的Service Bus(OnPremises)
- 我知道有关上传的内容,我们是否必须在接收端做一些事情?
- Application Insights不记录自定义事件