代码之家  ›  专栏  ›  技术社区  ›  Devvox93

C#Web API POST参数FromBody始终为空

  •  3
  • Devvox93  · 技术社区  · 8 年前

    我在网上搜索了几个小时,尝试了许多不同的解决方案,在StackOverflow上也有描述。我知道以前也有人问过类似的问题,但没有一个答案或评论对我有用。

    问题:我有一个.NETWebAPI,它有一个带有一些参数的Post方法。 其中一个参数是一个应该从主体中读取的复杂对象(即JSON)。然而,这 对象始终为空 .

    这是我的代码:

    // POST api/worksheets/post_event/true/false
            [Route("post_event/{newWorksheet}/{eindEvent}")]
            [HttpPost]
            public Event Post(bool newWorksheet, bool eindEvent, [FromBody] Event eventData)
            {
                return eventData;
            }
    

    需要明确的是:eventData是始终为空的对象。正确读取布尔值。

    完整的请求正文是:

    POST http://localhost:5000/api/worksheets/post_event/true/false
    Content-Type: application/json
    {"Persnr":1011875, "WorksheetId":null, "Projectnr":81445, "Uursoort":8678, "Tijd":{"09-08-2016 9:25"}}
    

    作为参考,这是事件类:

    public class Event
        {
            public long Persnr { get; set; }
            public int WorksheetId { get; set; }
            public int Projectnr { get; set; }
            public int Uursoort { get; set; }
            public DateTime Tijd { get; set; }
        }
    

    我已经尝试了一些东西:

    • 将JSON更改为不同的格式(仅值,“Event”:{}围绕实际对象,JSON前面为=)。
    • 将默认ctor添加到Event。
    • 移除[FromBody]标签。如果这样做,Event对象不为空,但所有属性都为空。属性可以通过URI填充,但这不是所需的行为。

    根据我阅读过的所有解决方案和文档,它应该简单地按照上面显示的方式工作。 我错过了什么?

    3 回复  |  直到 8 年前
        1
  •  1
  •   jimmy    8 年前

    您的json对象无效。我的建议是始终运行通过json解析器手动编写的json对象,如下所示: http://json.parser.online.fr/

    "Tijd":{"09-08-2016 9:25"}
    

    应该改为

    "Tijd":["09-08-2016 9:25"]
    
        2
  •  1
  •   Dmitry Pavlov    7 年前

    当您的对象无法从JSON请求反序列化时,通常会发生这种情况。

    最佳做法是 确保所有请求属性都可以接受 null 价值观 (make值类型属性为 nullable ). 然后您可以验证是否提供了所有需要的请求属性,或者返回 400 error 如果没有。这样,您至少能够了解是什么请求属性导致了问题。

        3
  •  0
  •   Pavel Tsybulivskyi    8 年前

    此类型的正确JSON应该是

    {"Persnr":1011875, "WorksheetId":null, "Projectnr":81445, "Uursoort":8678, "Tijd":"09-08-2016 9:25"}
    

    Tijd没有大括号,因为Tijd是纯DateTime属性,可以从表示DateTime的字符串推断出来