HttpPut 的正确语法
Proper Syntax of HttpPut
我正在研究 MicroSoft 的 Tutorial: Create a web API with ASP.NET Core MVC。它会逐步向您解释如何创建 HttpGet / HttpPost / HttpPut 等以及如何调用它们。
我的问题是:我无法调用 HttpPut
演示项目代表一个包含待办事项的数据库。
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
}
正如预期的那样,添加了待办事项并返回了填充的 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
}
邮递员收到以下原始 JSON 数据:
{
"": [
"The input was not valid."
]
}
奇怪的是,如果我更改方法定义,函数将使用相同的 JSON 输入调用:
[HttpPut("{id}")]
public async Task<IActionResult> PutTodoItem(long id)
{
... // breakpoint hit
}
显然我没有什么要更新的。
我认为 HttpPutAttribute 中的参数不正确。我应该改变什么才能让我的看跌期权被跟进?
您的 PUT
方法应在 TodoItem
参数之前包含 [FromBody]
,如下所示:
[HttpPut("{id}")]
public async Task<IActionResult> PutTodoItem(long id, [FromBody] TodoItem todo)
{
... // now the breakpoint is hit!
}
我正在研究 MicroSoft 的 Tutorial: Create a web API with ASP.NET Core MVC。它会逐步向您解释如何创建 HttpGet / HttpPost / HttpPut 等以及如何调用它们。
我的问题是:我无法调用 HttpPut
演示项目代表一个包含待办事项的数据库。
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
}
正如预期的那样,添加了待办事项并返回了填充的 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
}
邮递员收到以下原始 JSON 数据:
{
"": [
"The input was not valid."
]
}
奇怪的是,如果我更改方法定义,函数将使用相同的 JSON 输入调用:
[HttpPut("{id}")]
public async Task<IActionResult> PutTodoItem(long id)
{
... // breakpoint hit
}
显然我没有什么要更新的。
我认为 HttpPutAttribute 中的参数不正确。我应该改变什么才能让我的看跌期权被跟进?
您的 PUT
方法应在 TodoItem
参数之前包含 [FromBody]
,如下所示:
[HttpPut("{id}")]
public async Task<IActionResult> PutTodoItem(long id, [FromBody] TodoItem todo)
{
... // now the breakpoint is hit!
}