Put REST API 사용하기

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

asp.net 코어 레스트 API 넣기

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

답글 남기기