Правильный синтаксис HttpPut - PullRequest
0 голосов
/ 14 февраля 2019

Я изучаю учебник MicroSoft по : создание веб-API с помощью 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": 3,
    "name": "get up in the morning",
    "isComplete": true
}

Также возможно HttpGet элемент Todo с идентификатором 3.HttpPut не работает, функция вообще не вызывается:

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

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

Почтальон получает следующие необработанные данные JSON:

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

Странно то, что если я изменюопределение метода, функция вызывается с тем же вводом JSON:

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

Очевидно, мне нечего обновлять.

Я думаю, что параметр в HttpPutAttribute неверен.Что я должен изменить, чтобы получить пут?

1 Ответ

0 голосов
/ 14 февраля 2019

Ваш PUT метод должен содержать [FromBody] перед параметром TodoItem следующим образом:

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