代码之家  ›  专栏  ›  技术社区  ›  Harald Coppoolse

HttpPut的正确语法

  •  1
  • Harald Coppoolse  · 技术社区  · 7 年前

    我在研究微软的 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 .有了邮递员,我就可以得到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的待办事项。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中的参数不正确。我应该做什么改变才能得到我的put?

    0 回复  |  直到 7 年前
        1
  •  2
  •   TanvirArjel    7 年前

    你的 PUT 方法应该包含 [FromBody] 在 TodoItem 参数如下:

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