首页 > 解决方案 > 使用 CURL 发送到 Azure Function 的 Newtonsoft 反序列化 JSON 的异常

问题描述

使用 CURL 发布到我的 API 时,我使用的语法是:

curl -H "Content-Type:application/json" -X POST -d '{"domainName":"fabrikam.onmicrosoft.com","apiKey":"980709a87df09a78dsf90a8s7f"}' http://localhost:7071/api/getnodedata

我的 Web API 通过以下方式接收请求:

dynamic data = await req.Content.ReadAsAsync<object>();
NodeModel nodeData = Newtonsoft.Json.JsonConvert.DeserializeObject<NodeModel>(data);

我的课很简单:

public class NodeModel : TableEntity
{
    public string DomainName { get; set; }
    public string ApiKey { get; set; }
}

public static NodeModel(string DomainName, string ApiKey)
{
    this.PartitionKey = DomainName;
    this.RowKey = ApiKey;
}

检查data让我'{domainName:fabrikam.onmicrosoft.com,apiKey:980709a87df09a78dsf90a8s7f}'看起来不错,除了每个键/值对周围缺少双引号。CURL 在发送之前删除双引号(使用 Fiddler 跟踪验证)。

我在func.exe本地应用程序中遇到如下异常:

mscorlib:执行函数时出现异常:GetNodeData。Newtonsoft.Json:解析布尔值时出错。路径“域名”

我试过了:

  1. 键/值之间的空格
  2. 包裹键的单引号
  3. 包裹值的单引号
  4. 研究 Newtonsoft 网站以获得正确的语法
  5. 研究此站点以获取其他示例(这似乎与我正在做的事情没有任何不同)。

有关使用其他工具的任何建议或说明?我也有 Fiddler,但还没有使用它POST来将数据传输到服务中。

标签: c#jsonjson.netazure-functions

解决方案


总结答案中的评论......

  1. 使用 Fiddler - 这是一个很棒的工具,但它可以作为您机器上的代理服务器。各种工具将不尊重系统设置,并且curl是其中之一。.NETHttpClient也是一样。所以你需要告诉它使用代理--proxy(或-x简称:

    curl -H "Content-Type: application/json" -X POST -d '...snip...' http://localhost:7071/api/getnodedata -x http://localhost:8888
    
  2. curl正在去掉双引号。为了解决这个问题,您需要使用双引号将数据括起来并用反斜杠转义内引号:

    -d "{\"domainName\": \"fabrikam.onmicrosoft.com\", \"apiKey\": \"980709a87df09a78dsf90a8s7f\"}"
    
  3. 我通常不建议使用curl它来测试 API。这是一个很棒的工具,但正如您所见,使用起来很尴尬。相反,我建议使用Postman

  4. 奖金!您的 C# 代码也有点歪斜。将数据作为字符串读取并传递给 JSON.Net:

    string data = await req.Content.ReadAsStringAsync();
    NodeModel nodeData = Newtonsoft.Json.JsonConvert.DeserializeObject<NodeModel>(data);
    

    或者,更好的是,让您已经在使用的扩展程序为您完成工作:

    NodeModel nodeData = await req.Content.ReadAsAsync<NodeModel>();
    

推荐阅读