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

时间:2017-12-15 21:24:21

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

以下是来自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 - &gt;这种情况下,端点在浏览器中工作正常。但是为了测试上面的api而不是testing,当我在浏览器web地址中输入整个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作为对象。

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

    由于

1 个答案:

答案 0 :(得分: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
    }
    

    最后&#34;型号&#34;参数将填充您从客户端发送的值。

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

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