【问题标题】:WebApi Accepting Json Issues - ZenDeskWebApi 接受 Json 问题 - ZenDesk
【发布时间】:2017-11-18 10:12:20
【问题描述】:

我有以下 Asp.Net Web Api v2 控制器 - 作为一个基本示例:

    [HttpPost]
    public IHttpActionResult TestPost([FromBody]string value)
    {       
       l.TestNotify(value, "test");     
       return Ok();
    }

当我使用简单的“Hello world”将 JSON 请求传递给控制器​​时 - 我能够毫无问题地获取值。当我使用更复杂的 JSON 时,value 参数返回空。

我使用 restsharp 的测试程序测试了相同的 JSON,它可以正常工作。

这是请求:

Content-Type    application/json; charset=utf-8
Accept-Encoding gzip;q=1.0,deflate;q=0.6,identity;q=0.3
Accept  */*
Content-Length  743

这是 Json 代码段:

{
  "ticket": {
    "url": "",
    "id": "",
    "external_id": null,
    "FromEmail": "cody",
    "via": "Mail",
  }
}

我的猜测是请求差异之间有一些关系,但没有什么明显的想法。其他读取请求内容的方法或调整我对上述 http 请求的理解将不胜感激。

【问题讨论】:

    标签: asp.net json asp.net-web-api zendesk


    【解决方案1】:

    不要使用string,而是为输入类型创建一个类。

    所以这个类应该是这样的:

    public class Ticket
    {
        public string url { get; set; }
        public string id { get; set; }
        public object external_id { get; set; }
        public string FromEmail { get; set; }
        public string via { get; set; }
    }
    
    public class TicketRoot
    {
        public Ticket ticket { get; set; }
    }
    

    然后使用TicketRoot 类型而不是控制器中的string

    【讨论】:

    • 效果很好。这是为什么?我已经建立了一个类,以便稍后对其进行反序列化。我想知道差异背后的原因是什么。
    • 让框架进行(反)序列化有很多好处。例如,您可以指定 Content-Type: application/xml 标头,这将使您的 Web API 接受 XML 而不是 JSON,而无需对代码进行任何更改。它还可以帮助您编写易于重构的测试,您只需重命名属性,所有引用都将在整个解决方案中重命名。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2016-02-25
    • 2013-11-16
    相关资源
    最近更新 更多