【问题标题】:C# Web API POST parameter FromBody is always nullC# Web API POST 参数 FromBody 始终为空
【发布时间】:2017-09-13 19:30:50
【问题描述】:

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

问题:我有一个带有一些参数的 Post-method 的 .NET Web API。 其中一个参数是一个复杂的对象,应该从正文中读取(即 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 前面)。
  • 仅使用 Event 参数进行测试(删除其他参数以及路由中的参数)
  • 为 Event 添加一个默认 ctor。
  • 删除 [FromBody] 标签。如果我这样做,事件对象不为空,但所有属性都是。可以通过 URI 填充属性,但这不是所需的行为。

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

【问题讨论】:

  • worksheetId 应该是一个 int 而不是一个可为空的 int 对吧?
  • 我相信 Jsonserializer 会自动将其转换为 0,不是吗?
  • 最有可能的是,确保您的事件绑定到正确的命名空间,您可以将其绑定到控制器中的不同类
  • 不是这样,强尼,但谢谢!
  • 这实际上是您对 int 的回答(不应传递 null 而是 0)和日期时间应不带括号/大括号的组合。

标签: c# json http-post asp.net-web-api2 frombodyattribute


【解决方案1】:

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

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

应该是

"Tijd":["09-08-2016 9:25"]

【讨论】:

  • 它在没有括号或大括号的情况下工作(所以只是"09-08-2016 9:25")。也感谢您链接到解析器。它有帮助:) 问题是,我犯了 2 个错误。日期,还有 int 值。它不能为空,而是 0。它应该只是解析了正确的值,至少那时我可以看到问题出在那些特定的字段上。
  • @DevvoX 我假设您在添加大括号后试图创建一个时间数组;)
【解决方案2】:

这种类型的正确 JSON 应该只是

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

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

【讨论】:

  • 好吧,我假设花括号的目的是拥有几个时间对象的数组。因此,他应该使用括号而不是删除大括号。
  • 这实际上是您对日期的回答(不应使用大括号/方括号传递)和 int 值应为 0,而不是 null。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 2018-12-26
    • 2015-11-05
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    相关资源
    最近更新 更多