Post REST API 사용하기

URI /api/employees 에 HTTP POST 요청을 만듭니다 이유는 /api/employees 컬렉션에 새 직원을 추가하기를 원하기 때문에 의미가 있습니다.

asp.net 코어 레스트 API 포스트

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가지 일이 발생합니다.

  1. 직원 추가가 성공적으로 생성되었음을 나타내기 위해 http 상태 코드 201을 반환합니다.
  2. 새로 생성된 직원을 반환합니다.
  3. 응답에 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");
            }
        }
    }
}

This Post Has 4 Comments

  1. Avery Mcgee

    Your positivity and enthusiasm are infectious It’s clear that you are truly passionate about what you do and it’s inspiring to see

  2. Lochlan Hays

    Your writing is so engaging and easy to read It makes it a pleasure to visit your blog and learn from your insights and experiences

  3. Ezekiel Ezequiel Ean Hodge

    Your posts are so thought-provoking and often leave me pondering long after I have finished reading Keep challenging your readers to think outside the box

  4. mancing138

    Your writing is so inspiring and motivating I always leave your blog feeling more determined and resilient

답글 남기기