在Web API控制器中接收Json字符串

问题描述 投票:0回答:1

以下是来自WPF app的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 Api 2应用程序,我想在我新创建的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字符串之间的双引号和冒号,浏览器显示错误页面。

屏幕如下,

enter image description here

  1. 我想知道,我开发的API函数是正确的接收Json字符串。如果有任何好方法请指导我。
  2. 我可以通过输入Json字符串来了解测试此API的更好方法。
  3. 是否有可能在api中接收Json作为对象。

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

谢谢

c# json asp.net-web-api c#-4.0
1个回答
2
投票

通常,在需要发送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应该从请求的主体中获取模型。
© www.soinside.com 2019 - 2024. All rights reserved.