【问题标题】:Posting JSON to DocumentDB through REST API通过 REST API 将 JSON 发布到 DocumentDB
【发布时间】:2015-10-27 04:09:26
【问题描述】:

刚刚从 Sql Server 过渡到 Microsoft 的 DocumentDB 服务,我正在努力通过他们的 REST API (https://msdn.microsoft.com/en-us/library/azure/dn803948.aspx) 创建文档。我尝试过使用 RestSharp 和 WebClient,但没有成功。我敢肯定这可能是一个简单的疏忽。下面的代码有一个 Account 对象,它只有所需的属性 (id) ...只是为了测试。任何帮助都会很棒。

public class Account
{
    public string id { get; set; }

}

////////////////////////////////////

  Account customerAcc = new Account
    {
        id = "test1"

    };

////////////////////////////////////////////

 var baseUrl = Environment.GetEnvironmentVariable("APPSETTING_documentDB_endpoint");
 var primary_key = Environment.GetEnvironmentVariable("APPSETTING_documentDB_primary_key");
 var client = new RestClient(baseUrl);
 var data = "type=master&ver=1.0&sig=" + primary_key;

 RestRequest restRequest = new RestRequest(Method.POST);
 restRequest.RequestFormat = DataFormat.Json;
 restRequest.AddHeader("Authorization", data);
 restRequest.AddHeader("x-ms-date",now.ToUniversalTime().ToString());
 restRequest.AddBody(customerAcc);

 IRestResponse irestResponse = client.Execute(restRequest);


 ///////////////////////////////////// OR WITH SYSTEM.NET.WEBCLIENT
  string result = "";
  using (var newClient = new System.Net.WebClient())
        {
            newClient.Headers[System.Net.HttpRequestHeader.ContentType] = "application/json";
            newClient.Headers["Authorization"] = data;
            newClient.Headers["x-ms-date"] = now.ToUniversalTime().ToString();
            result = newClient.UploadString(baseUrl, "POST", "{\"id\":\"test1\"}");
        }

呼叫正在获得授权,但仍会收到 400 状态代码 (BAD REQUEST) 响应。我已经尝试序列化对象,并将 restRequest.AddBody 替换为 restRequest.AddParameter("application/json; charset=utf-8",json,ParameterType.RequestBody)。这没有任何影响。

【问题讨论】:

  • 问题不在于客户端库,而在于请求。当请求仍然中断时,更改客户端无济于事。首先尝试使用 Postman 或 curl 之类的工具创建一个有效的 HTTP 请求,然后尝试为什么要尝试 WebClient 而不是 HttpClient 或者 DocumentDB 的 .NET 库?
  • 使用 Fiddler 查看发送到服务的确切内容,并将其与文档的 [请求示例] 进行比较。文档说 400 意味着 Json 正文格式错误,但您可能会发现其他缺少的标头
  • @Panagiotis - 感谢您的建议,我会尝试 Fiddler。关于代码,我只是展示了我尝试过的两个客户端版本,但没有一起运行它们。我更喜欢 RestSharp 但很快尝试了 WebClient 以查看是否有任何变化。我没有使用 .NET 库,因为我只需要在处理程序文件中进行几次快速调用,不幸的是,所有异步要求都有问题。

标签: c# json azure restsharp azure-cosmosdb


【解决方案1】:

如果您尝试在 .NET 应用程序中使用 Azure DocumentDB - 您可能会发现简单地使用 .NET SDK 会更容易。

假设您真的想让 REST API 正常工作...简要浏览一下,我发现有一些需要更改的地方:

1.) auth 键看起来关闭。

 var primary_key = Environment.GetEnvironmentVariable("APPSETTING_documentDB_primary_key");
 // ...
 var data = "type=master&ver=1.0&sig=" + primary_key;
 // ...
 restRequest.AddHeader("Authorization", data);

您需要生成哈希签名,而不是传递主密钥。你可以找到documentation on auth here.

2.) 您发送 POST 请求的 URI 看起来有点不对劲。

var baseUrl = Environment.GetEnvironmentVariable("APPSETTING_documentDB_endpoint");
// ...
result = newClient.UploadString(baseUrl, "POST", "{\"id\":\"test1\"}");

您需要根据您尝试操作的资源来构建 URI。例如,用于创建文档的 URI 应类似于:

https://{databaseaccount}.documents.azure.com/dbs/{_rid-db}/colls/{_rid-col}/docs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-21
    • 2011-12-15
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多