【问题标题】:Proper Syntax of HttpPutHttpPut 的正确语法
【发布时间】:2019-02-14 12:47:46
【问题描述】:

我正在学习微软的Tutorial: Create a web API with ASP.NET Core MVC。它逐步向您解释如何创建 HttpGet / HttpPost / HttpPut 等以及如何调用它们。

我的问题是:我无法调用 HttpPut

演示项目代表一个包含 Todo 项目的数据库。

TodoController 包含创建/获取/更新/删除 TodoItem 的函数。

HttpGet 和 HttpPost 按预期工作。我在使用 HttpPut 更新现有项目时遇到问题。

class TodoItem
{
    public long Id { get; set; }
    public string Name { get; set; }
    public bool IsComplete { get; set; }
}

class TodoController : ControllerBase
{
    // Get all Todo items
    [HttpGet]
    public async Task<ActionResult<IEnumerable<TodoItem>>> GetTodoItems() {...}
    // get Todo item by Id
    [HttpGet("{id}")]
    public async Task<ActionResult<TodoItem>> GetTodoItem(long id){...}

    // Create a Todo item and return it with filled Id:
    [HttpPost]
    public async Task<ActionResult<TodoItem>> PostTodoItem(TodoItem todo) {...}

    // The followingmethod is never called:    
    [HttpPut("{id}")]
    public async Task<IActionResult> PutTodoItem(long id, TodoItem todo)
    {
        ... // breakpoint never hit
    }
}

对于测试,我使用PostMan。使用 Postman,我可以使用 HttpGet 和 HttpPost。比如HttpPost:

Post to: https://localhost:44305/api/todo

Raw JSON body:
{
    "name":"get up in the morning",
    "isComplete":true
}

正如预期的那样,Todo 项被添加并返回一个填充的 Id:

{
    "id": 3,
    "name": "get up in the morning",
    "isComplete": true
}

也可以通过 HttpGet 获取 ID 为 3 的 Todo 项。HttpPut 不起作用,根本不调用该函数:

PUT: https://localhost:44305/api/todo/3

Raw JSON body:
{
    "id": 3,
    "name": "changed1",
    "isComplete": false
}

Postman 收到以下原始 JSON 数据:

{
    "": [
        "The input was not valid."
        ]
}

奇怪的是,如果我更改方法定义,函数会使用相同的 JSON 输入调用:

[HttpPut("{id}")]
public async Task<IActionResult> PutTodoItem(long id)
{
    ... // breakpoint hit
}

显然我没有什么要更新的。

我认为 HttpPutAttribute 中的参数不正确。我应该改变什么才能让我的看跌期权被跟注?

【问题讨论】:

    标签: asp.net asp.net-core http-put


    【解决方案1】:

    您的PUT 方法应在TodoItem 参数之前包含[FromBody],如下所示:

    [HttpPut("{id}")]
    public async Task<IActionResult> PutTodoItem(long id, [FromBody] TodoItem todo)
    {
         ... // now the breakpoint is hit!
    }
    

    【讨论】:

      猜你喜欢
      • 2019-11-26
      • 1970-01-01
      • 2017-06-22
      • 2011-08-21
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      • 2014-10-29
      • 1970-01-01
      相关资源
      最近更新 更多