기존 항목을 업데이트하려면 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"); } } } }