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");
}
}
}
}