documentDB Rest API - 创建文档
documentDB Rest API - create document
我正在尝试将 documentdb 支持添加到一个用 dotnetcore 编写的现有应用程序,所以我不能使用 SDK,但我想我应该使用 REST API。足够简单,样本也很容易复制。我可以完成 REST API 示例中的所有 list/queries。
尝试创建文档时出现问题。我不断面对 401,似乎无法绕过它。我使用的是主键 - 而不是只读键。我已经阅读 re-read 此处的 API 文档:https://msdn.microsoft.com/en-us/library/azure/mt489088.aspx 但无法完全实现。
它可能与我的授权密钥有关,但我使用的是示例 GenerateMasterKeyAuthorizationSignature(string verb, string resourceId, string resourceType, string key, string keyType, string tokenVersion)
中的方法,它非常适合查询。我正在使用基于 ID 的 resourceId,并认为我可以重用之前的代码:
resourceLink = string.Format("dbs/{0}/colls/{1}/docs", databaseId, collectionId);
resourceId = (idBased) ? string.Format("dbs/{0}/colls/{1}/docs", databaseId, collectionId) : collectionId.ToLowerInvariant();`
时间戳似乎是正确的,因为查询有效,尽管我在其他地方看到过这个问题。我正在使用 Ryan 的 PostWithNoCharSetAsync
我试过有无 client.DefaultRequestHeaders.Add("x-ms-documentdb-is-upsert", "true");
会不会有分区的东西?我应该指定吗?
API 文档有 headers 像 cookie 和 no-cache。那些没有什么不同是吗?
如果 JSON 文档遇到字符串文字标记是否重要 - 如下所示:" {\r\n \"id\": 4441,\r\n \"Name\": \"Artesia Spa - Grand Hotel\",\r\n }
下面是来自 fiddler 的 POST。
请求
POST https://etest.documents.azure.com/dbs/etest/colls/unittest/docs HTTP/1.1
x-ms-date: Tue, 08 Nov 2016 20:34:40 GMT
x-ms-version: 2015-12-16
authorization: type%3dmaster%26ver%3d1.0%26sig%3dU8BmnPhUMWyoVqNdbI0hy1Kc%2b1Yge79dCBMz8f2v9pE%3d
x-ms-documentdb-is-upsert: true
Content-Type: application/query+json
Host: etest.documents.azure.com
Content-Length: 48
Expect: 100-continue
{"id": 4441,"Name": "Artesia Spa - Grand Hotel"}
回应
HTTP/1.1 401 Unauthorized
Content-Type: application/json
Server: Microsoft-HTTPAPI/2.0
x-ms-activity-id: d83ae44f-3dc8-47a6-b310-cdf8ca87c597
Strict-Transport-Security: max-age=31536000
x-ms-gatewayversion: version=1.10.39.1
Date: Tue, 08 Nov 2016 20:36:11 GMT
Content-Length: 358
{"code":"Unauthorized","message":"The input authorization token can't serve the request. Please check that the expected payload is built as per the protocol, and check the key being used. Server used the following payload to sign: 'post\ndocs\ndbs/etest/colls/unittest\ntue, 08 nov 2016 20:34:40 gmt\n\n'\r\nActivityId: d83ae44f-3dc8-47a6-b310-cdf8ca87c597"}
现在有一个官方的 .Net Core SDK 可以获取和使用,就像以前的 SDK,from Nuget。
如果您需要完整示例,可以查看我发布的 GitHub repo,其中涵盖了最常见的场景。
因为我只花了大约 2 天的时间试图解决这个问题,所以这里是任何感兴趣的人的实际答案。 DocumentDB 现在是 CosmosDB。
创建数据库
var verb = "POST";
var resourceId = "";
var resourceType = "dbs";
var resourceLink = "dbs";
var body = new { id = "<databaseId>" };
创建一个Collection
var verb = "POST";
var resourceId = "dbs/<databaseId>";
var resourceType = "colls";
var resourceLink = "dbs/<databaseId>/colls";
var body = new { id = "<collectionId>" };
创建文档
var verb = "POST";
var resourceId = "dbs/<databaseId>/colls/<collectionId>";
var resourceType = "docs";
var resourceLink = "dbs/<databaseId>/colls/<collectionId>/docs";
var body = new { id = "<documentId>" };
创建用户
var verb = "POST";
var resourceId = "dbs/<databaseId>";
var resourceType = "users";
var resourceLink = "dbs/<databaseId>/users";
var body = new { id = "<userId>" };
**基本上 resourceId 与 resourceLink 相同,但没有最后一个选项(这对我来说并不明显)
设置请求类似这样的内容 (see the example program from msft for the rest)
var client = new System.Net.Http.HttpClient();
string response = string.Empty;
string authHeader = string.Empty;
authHeader = GenerateMasterKeyAuthorizationSignature(verb, resourceId, resourceType, key, keyType, tokenVersion);
client.DefaultRequestHeaders.Add("x-ms-date", utc_date);
client.DefaultRequestHeaders.Add("x-ms-version", "2017-02-22");
client.DefaultRequestHeaders.Remove("authorization");
client.DefaultRequestHeaders.Add("authorization", authHeader);
另请注意,MSFT 的示例程序包含用于查询的 NoCharSetJsonMediaTypeFormatter。这需要为 POST 更新,因为 header 需要 "application/json" 而不是 "application/query+json"
我正在尝试将 documentdb 支持添加到一个用 dotnetcore 编写的现有应用程序,所以我不能使用 SDK,但我想我应该使用 REST API。足够简单,样本也很容易复制。我可以完成 REST API 示例中的所有 list/queries。
尝试创建文档时出现问题。我不断面对 401,似乎无法绕过它。我使用的是主键 - 而不是只读键。我已经阅读 re-read 此处的 API 文档:https://msdn.microsoft.com/en-us/library/azure/mt489088.aspx 但无法完全实现。
它可能与我的授权密钥有关,但我使用的是示例 GenerateMasterKeyAuthorizationSignature(string verb, string resourceId, string resourceType, string key, string keyType, string tokenVersion)
中的方法,它非常适合查询。我正在使用基于 ID 的 resourceId,并认为我可以重用之前的代码:
resourceLink = string.Format("dbs/{0}/colls/{1}/docs", databaseId, collectionId);
resourceId = (idBased) ? string.Format("dbs/{0}/colls/{1}/docs", databaseId, collectionId) : collectionId.ToLowerInvariant();`
时间戳似乎是正确的,因为查询有效,尽管我在其他地方看到过这个问题。我正在使用 Ryan 的 PostWithNoCharSetAsync
我试过有无 client.DefaultRequestHeaders.Add("x-ms-documentdb-is-upsert", "true");
会不会有分区的东西?我应该指定吗?
API 文档有 headers 像 cookie 和 no-cache。那些没有什么不同是吗?
如果 JSON 文档遇到字符串文字标记是否重要 - 如下所示:" {\r\n \"id\": 4441,\r\n \"Name\": \"Artesia Spa - Grand Hotel\",\r\n }
下面是来自 fiddler 的 POST。
请求
POST https://etest.documents.azure.com/dbs/etest/colls/unittest/docs HTTP/1.1
x-ms-date: Tue, 08 Nov 2016 20:34:40 GMT
x-ms-version: 2015-12-16
authorization: type%3dmaster%26ver%3d1.0%26sig%3dU8BmnPhUMWyoVqNdbI0hy1Kc%2b1Yge79dCBMz8f2v9pE%3d
x-ms-documentdb-is-upsert: true
Content-Type: application/query+json
Host: etest.documents.azure.com
Content-Length: 48
Expect: 100-continue
{"id": 4441,"Name": "Artesia Spa - Grand Hotel"}
回应
HTTP/1.1 401 Unauthorized
Content-Type: application/json
Server: Microsoft-HTTPAPI/2.0
x-ms-activity-id: d83ae44f-3dc8-47a6-b310-cdf8ca87c597
Strict-Transport-Security: max-age=31536000
x-ms-gatewayversion: version=1.10.39.1
Date: Tue, 08 Nov 2016 20:36:11 GMT
Content-Length: 358
{"code":"Unauthorized","message":"The input authorization token can't serve the request. Please check that the expected payload is built as per the protocol, and check the key being used. Server used the following payload to sign: 'post\ndocs\ndbs/etest/colls/unittest\ntue, 08 nov 2016 20:34:40 gmt\n\n'\r\nActivityId: d83ae44f-3dc8-47a6-b310-cdf8ca87c597"}
现在有一个官方的 .Net Core SDK 可以获取和使用,就像以前的 SDK,from Nuget。
如果您需要完整示例,可以查看我发布的 GitHub repo,其中涵盖了最常见的场景。
因为我只花了大约 2 天的时间试图解决这个问题,所以这里是任何感兴趣的人的实际答案。 DocumentDB 现在是 CosmosDB。
创建数据库
var verb = "POST";
var resourceId = "";
var resourceType = "dbs";
var resourceLink = "dbs";
var body = new { id = "<databaseId>" };
创建一个Collection
var verb = "POST";
var resourceId = "dbs/<databaseId>";
var resourceType = "colls";
var resourceLink = "dbs/<databaseId>/colls";
var body = new { id = "<collectionId>" };
创建文档
var verb = "POST";
var resourceId = "dbs/<databaseId>/colls/<collectionId>";
var resourceType = "docs";
var resourceLink = "dbs/<databaseId>/colls/<collectionId>/docs";
var body = new { id = "<documentId>" };
创建用户
var verb = "POST";
var resourceId = "dbs/<databaseId>";
var resourceType = "users";
var resourceLink = "dbs/<databaseId>/users";
var body = new { id = "<userId>" };
**基本上 resourceId 与 resourceLink 相同,但没有最后一个选项(这对我来说并不明显)
设置请求类似这样的内容 (see the example program from msft for the rest)
var client = new System.Net.Http.HttpClient();
string response = string.Empty;
string authHeader = string.Empty;
authHeader = GenerateMasterKeyAuthorizationSignature(verb, resourceId, resourceType, key, keyType, tokenVersion);
client.DefaultRequestHeaders.Add("x-ms-date", utc_date);
client.DefaultRequestHeaders.Add("x-ms-version", "2017-02-22");
client.DefaultRequestHeaders.Remove("authorization");
client.DefaultRequestHeaders.Add("authorization", authHeader);
另请注意,MSFT 的示例程序包含用于查询的 NoCharSetJsonMediaTypeFormatter。这需要为 POST 更新,因为 header 需要 "application/json" 而不是 "application/query+json"