【问题标题】:Receiving Json string in Web API controller在 Web API 控制器中接收 Json 字符串
【发布时间】:2018-05-30 02:49:51
【问题描述】:

以下是我来自 WPF 应用程序的 Json 输入字符串,

{{
  "Country of Origin": "UNITED STATES",
  "Commodity": "APPLES",
  "Variety": "Green",
  "Upcs": [
    {
      "timestamp": "2017-09-19T21:05:12.8550708+05:30",
      "value": "038452735329R5"
    },
    {
      "timestamp": "2017-09-19T21:05:12.8550708+05:30",
      "value": "038452735330R5"
    }
  ],
  "ipAddress": "127.0.0.1",
  "lat": "155.00",
  "Lot": "101.14",
  "long": "-202.00",
  "onBehalfOf": "679",
  "ClientVersion": "10.0.7",
  "submittedBy": "679"
}}

我在 .net (VS2015) 中创建了一个 Rest Api2 应用程序,我想在我新创建的 API 中接收上述 JSON 字符串以进行进一步处理。

在 WPF 中,我使用 WebClient 发送 Json 字符串。

下面是我尝试接收Json字符串的API函数,

    [Route("api/events/getevents/{events}/{producerId}")]
    [HttpGet, HttpPost]
    public async Task<IHttpActionResult> GetEvents(string events, string producerId)
    {
        try
        {
            await _getEventsAction.GetEventJson(events, producerId).ConfigureAwait(false);
            return Ok("Success");
        }
        catch (AggregateException ex)
        {
            return Ok(new { ex.InnerException.Message, Success = false, ex.StackTrace, Exception = ex });
        }
        catch (Exception ex)
        {
            return Ok(new { ex.Message, Success = false, ex.StackTrace, Exception = ex });
        }
    }

在本地运行应用程序后,我通过证明以下值在 Web 浏览器中测试了 api,即对于 events="testing" 和 producerId="554",最终端点如下所示,

http://localhost:18572/api/events/getevents/testing/554 -> 在这种情况下,端点在浏览器中工作正常。但是为了测试上面的 api,而不是 testing,当我在浏览器网址中输入整个 Json 字符串时,浏览器将错误显示为 "A potentially dangerous Request.Path value was detected from the client (:)." 。这是由于json字符串之间的双引号和冒号,浏览器显示错误页面。

下面的屏幕,

  1. 我想知道,我开发的API函数接收Json字符串是正确的。如果有什么好的方法请指导我。

  2. 请问有什么更好的方法可以通过输入 Json 字符串来测试此 API。

  3. 是否可以在api中接收Json作为对象。

请帮助我编写此 API 以接收 Json 字符串或 Json 对象。

谢谢

【问题讨论】:

  • 去掉一个支架怎么样?
  • 这可能不是答案,我不确定.. 但看起来你是在一个对象中发送一个对象。您的 JSON 有两个左括号和两个右括号。尝试从每个中删除一个,也许这会有所帮助?
  • 您应该创建一个模型来匹配 JSON,然后将其用作带有 [FromBody] 装饰器的端点的输入。然后它会以 JSON 的形式进入函数,您可以反序列化到模型。
  • 仅供参考。乍一看,您似乎正在尝试创建一个 RESTful API。但是,当您尝试将整个 JSON 结构作为 URL 构成的一部分传入时,就会破坏 REST。您真的想发送一个 POST 请求,并让 JSON 成为该请求的主体。
  • @BrandonMiller 我将尝试删除一个括号。我可以知道如何在 api 中接收 Json 字符串。

标签: c# json asp.net-web-api c#-4.0


【解决方案1】:

通常情况下,当您需要发送 JSON 时,您应该发出 POST/PUT 请求并在请求正文中发送 JSON。

这样做:

  1. 您需要创建与您的 JSON 匹配的模型:

    [DataContract]
    public class MyModel
    {
        [DataMember(Name = "Country of Origin")]
        public string CountryOfOrigin { get; set; }
    
        [DataMember(Name = "Commodity")]
        public string Commodity { get; set; }
    
        // other fields
    }
    

    另外,请注意我使用 DataContract 和 DataMember 属性作为传入 JSON 字段未规范化(字段有空格和不同的大小写 (camelCase 和 CamelCaps))。

    如果您要将 JSON 规范化为 camelCase,则可以删除 DataContract 和 DataMember 属性。

  2. 将控制器中的操作更改为:

    [Route("api/events/getevents/{events}/{producerId}")]
    [HttpPost]
    public async Task<IHttpActionResult> GetEvents(string events, string producerId, [FromBody] MyModel model)
    {
        // your code
    }
    

    最后一个“模型”参数将填充您从客户端发送的值。

    [HttpPost] 属性表示此操作仅适用于 POST 请求。

    [FromBody] 属性表示 Web API 应该从请求的正文中获取模型。

【讨论】:

  • 我正在从 WPF 应用程序发送 JSON 字符串。我需要在 WPF 或 Web API 中创建模型吗?我是 RESTAPI 的新手,请给我一个如何从 WPF 应用程序发送它的示例。谢谢
  • @user2086641 您应该在您的 Web API 项目中创建上面显示的模型。不幸的是,我不是 WPF 开发人员,只是尝试查找与用于发送数据的类相关的示例(可能是 WebClient 或 HttpResponseMessage)。此外,在双方(客户端和服务器)上都有模型是一种很好的(常见)做法。如果您将在 WPF 应用程序和 Web API 后端创建模型,您的流程将如下所示: 1. 您正在准备模型并在 WPF 应用程序中对其进行序列化; 2. WPF 应用程序进行 API 调用。 3. Web API 在后台捕获请求并反序列化ОЫЩТ; 4. Web API 执行你的逻辑并返回结果。
猜你喜欢
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-25
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多