기존 항목을 업데이트하려면 URI /api/employees/ID 에 대한 HTTP PUT 을 사용합니다.
업데이트할 직원의 ID는 URI에 전달되어야 합니다.

ASP.NET Core REST API – HTTP PUT 예제
[Route("api/[controller]")]
[ApiController]
public class EmployeesController : ControllerBase
{
private readonly IEmployeeRepository employeeRepository;
public EmployeesController(IEmployeeRepository employeeRepository)
{
this.employeeRepository = employeeRepository;
}
[HttpPut("{id:int}")]
public async Task<ActionResult<Employee>> UpdateEmployee(int id, Employee employee)
{
try
{
if (id != employee.EmployeeId)
return BadRequest("Employee ID mismatch");
var employeeToUpdate = await employeeRepository.GetEmployee(id);
if (employeeToUpdate == null)
return NotFound($"Employee with Id = {id} not found");
return await employeeRepository.UpdateEmployee(employee);
}
catch (Exception)
{
return StatusCode(StatusCodes.Status500InternalServerError,
"Error updating data");
}
}
}
코드 설명
기존 직원을 업데이트하는데 사용되는게 PUT 입니다.
UpdateEmployee() 메서드가 HttpPut 속성으로 Decorate 된 이유입니다 .
EmployeesController 클래스는 ApiController 속성 으로 장식되어 있습니다 . 이 특성을 사용하면 요청의 데이터를 UpdateEmployee() 메서드의 직원 매개 변수 에 매핑할 수 있습니다 .
이 ApiController 속성이 필요하거나 메소드 매개변수가 [ FromBody ] 속성으로 decorate되어야 합니다. 그렇지 않으면 모델 바인딩이 예상대로 작동하지 않고 요청의 직원 데이터가 UpdateEmployee 메서드의 직원 매개 변수 에 매핑되지 않습니다 .
[HttpPut]
public async Task<IActionResult> UpdateEmployee(int id, [FromBody]Employee employee)
{
}
UpdateEmployee() 메서드의 HttpPut 특성 에도 경로 템플릿이 있습니다. 직원의 ID 는 URL /api/employees 에 추가됩니다 . 따라서 URL은 /api/employees/5 가 됩니다.
[HttpPut("{id:int}")]
public async Task<ActionResult<Employee>> UpdateEmployee(int id, Employee employee)
URL의 직원 ID 값은 UpdateEmployee(int id, Employee employee) 메서드 의 id 매개 변수에 자동으로 매핑됩니다 .
id 경로 매개 변수 에 int 경로 제약 조건을 사용하므로 URL의 id 값은 값이 정수인 경우에만 메서드 매개 변수에 매핑됩니다.
EmployeeController 코드 전체 내용
using EmployeeManagement.Api.Models;
using EmployeeManagement.Models;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Threading.Tasks;
namespace EmployeeManagement.Api.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class EmployeesController : ControllerBase
{
private readonly IEmployeeRepository employeeRepository;
public EmployeesController(IEmployeeRepository employeeRepository)
{
this.employeeRepository = employeeRepository;
}
[HttpGet]
public async Task<ActionResult> GetEmployees()
{
try
{
return Ok(await employeeRepository.GetEmployees());
}
catch (Exception)
{
return StatusCode(StatusCodes.Status500InternalServerError,
"Error retrieving data from the database");
}
}
[HttpGet("{id:int}")]
public async Task<ActionResult<Employee>> GetEmployee(int id)
{
try
{
var result = await employeeRepository.GetEmployee(id);
if (result == null)
{
return NotFound();
}
return result;
}
catch (Exception)
{
return StatusCode(StatusCodes.Status500InternalServerError,
"Error retrieving data from the database");
}
}
[HttpPost]
public async Task<ActionResult<Employee>> CreateEmployee(Employee employee)
{
try
{
if (employee == null)
{
return BadRequest();
}
var emp = employeeRepository.GetEmployeeByEmail(employee.Email);
if (emp != null)
{
ModelState.AddModelError("email", "Employee email already in use");
return BadRequest(ModelState);
}
var createdEmployee = await employeeRepository.AddEmployee(employee);
return CreatedAtAction(nameof(GetEmployee), new { id = createdEmployee.EmployeeId },
createdEmployee);
}
catch (Exception)
{
return StatusCode(StatusCodes.Status500InternalServerError,
"Error creating employee");
}
}
[HttpPut("{id}")]
public async Task<ActionResult<Employee>> UpdateEmployee(int id, Employee employee)
{
try
{
if (id != employee.EmployeeId)
return BadRequest("Employee ID mismatch");
var employeeToUpdate = await employeeRepository.GetEmployee(id);
if (employeeToUpdate == null)
return NotFound($"Employee with Id = {id} not found");
return await employeeRepository.UpdateEmployee(employee);
}
catch (Exception)
{
return StatusCode(StatusCodes.Status500InternalServerError,
"Error updating data");
}
}
}
}