URI /api/employees 에 HTTP POST 요청을 만듭니다 이유는 /api/employees 컬렉션에 새 직원을 추가하기를 원하기 때문에 의미가 있습니다.
ASP.NET Core REST API – HTTP POST 예제
[Route("api/[controller]")] [ApiController] public class EmployeesController : ControllerBase { private readonly IEmployeeRepository employeeRepository; public EmployeesController(IEmployeeRepository employeeRepository) { this.employeeRepository = employeeRepository; } [HttpPost] public async Task<ActionResult<Employee>> CreateEmployee(Employee employee) { try { if (employee == null) { return BadRequest(); } var createdEmployee = await employeeRepository.AddEmployee(employee); return CreatedAtAction(nameof(GetEmployee),new { id = createdEmployee.EmployeeId }, createdEmployee); } catch (Exception) { return StatusCode(StatusCodes.Status500InternalServerError,"Error creating new employee record"); } } }
코드 설명
새 직원을 만드는 데 사용되는 것은 POST 요청 입니다 .
EmployeesController 클래스는 ApiController 속성 으로 decorate되어 있습니다 . 이 특성을 사용하면 요청의 데이터를 CreateEmployee() 메서드 의 직원 매개 변수에 매핑할 수 있습니다 .
이 ApiController 속성이 필요하거나 메소드 매개변수가 [FromBody] 속성으로 decorate되어야 합니다. 그렇지 않으면 모델 바인딩이 예상대로 작동하지 않고 요청의 직원 데이터가 CreateEmployee 메서드의 직원 매개 변수에 매핑되지 않습니다 .
[HttpPost] public async Task<IActionResult> CreateEmployee([FromBody]Employee employee) { }
주입된 EmployeeRepository 인스턴스는 새 직원을 SQL Server 데이터베이스에 추가합니다.
var createdEmployee = await employeeRepository.AddEmployee(employee);
새 직원이 추가되면 일반적으로 다음 3가지 일이 발생합니다.
- 직원 추가가 성공적으로 생성되었음을 나타내기 위해 http 상태 코드 201을 반환합니다.
- 새로 생성된 직원을 반환합니다.
- 응답에 Location 헤더를 추가합니다. Location 헤더는 새로 생성된 직원 개체의 URI를 지정합니다.
CreatedAtAction 메서드는 위의 세 가지를 모두 달성하는 데 도움이 됩니다. 문자열에 메서드 이름(GetEmployee)을 포함하는 대신 nameof 연산자를 사용하고 있습니다 . 나중에 메서드 이름을 변경하고 여기에서 변경하는 것을 잊어버리면 컴파일러에서 오류가 발생하기 때문에 이것은 좋은 방법입니다.
return CreatedAtAction(nameof(GetEmployee), new { id = createdEmployee.EmployeeId }, createdEmployee);
요청 본문에 직원의 특정 속성에 대한 값을 포함하지 않는 경우. 해당 속성은 데이터 유형에 따라 null 또는 기본값 으로 설정됩니다 .
요청 본문에서 직원 개체에 존재하지 않는 속성을 포함하면 손실됩니다. 요청에 불필요하거나 추가 데이터가 포함된 경우 무시하면 됩니다.
완전한 REST API Controller 코드
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([FromBody]Employee employee) { try { if (employee == null) return BadRequest(); var createdEmployee = await employeeRepository.AddEmployee(employee); return CreatedAtAction(nameof(GetEmployee), new { id = createdEmployee.EmployeeId }, createdEmployee); } catch (Exception) { return StatusCode(StatusCodes.Status500InternalServerError, "Error creating new employee record"); } } } }