簡體   English   中英

documentDB Rest API-創建文檔

[英]documentDB Rest API - create document

我試圖將documentdb支持添加到以dotnetcore編寫的現有應用程序中,因此我無法使用SDK,但以為我只會使用REST API。 足夠容易,樣品也容易復制。 我可以很好地完成REST API示例中的所有列表/查詢。

嘗試創建文檔時出現問題。 我一直面對着401,似乎無法繞開它。 我正在使用主鍵-而不是只讀鍵。 而且我已經在這里閱讀並重新閱讀了API文檔: https : //msdn.microsoft.com/zh-cn/library/azure/mt489088.aspx,但不能完全使其正常工作。

這可能與我的auth密鑰有關,但是我正在使用示例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文檔具有標頭,例如cookie和no-cache。 那些沒有改變,是嗎?

JSON文檔是否帶有字符串文字標記是否重要-像這樣: " {\\r\\n \\"id\\": 4441,\\r\\n \\"Name\\": \\"Artesia Spa - Grand Hotel\\",\\r\\n }

下面是提琴手的帖子。

請求

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"}

由於我只花了2天的時間來解決這個問題,因此這是有興趣的人的實際答案。 現在,DocumentDB現在是CosmosDB。

創建一個數據庫

var verb = "POST";
var resourceId = "";
var resourceType = "dbs";
var resourceLink = "dbs"; 
var body = new { id = "<databaseId>" };

創建收藏

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相同,但沒有最后一個選項(這對我來說並不明顯)

安裝程序要求類似這樣的內容(有關其他信息, 請參見msft的示例程序

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,需要對此進行更新,因為標頭需要為“ application / json”而不是“ application / query + json”

現在有一個正式的.Net Core SDK,您可以像以前的SDK一樣從Nuget獲取和使用。

如果您需要完整的樣本,可以看一下我發布的GitHub存儲庫 ,其中涵蓋了最常見的場景。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM