Search REST API 사용하기

REST API에서 Search 기능을 구현하는 방법에 대해 설명합니다 .

[Route("api/[controller]")]
[ApiController]
public class EmployeesController : ControllerBase
{
    private readonly IEmployeeRepository employeeRepository;

    public EmployeesController(IEmployeeRepository employeeRepository)
    {
        this.employeeRepository = employeeRepository;
    }

    [HttpGet("{search}")]
    public async Task<ActionResult<IEnumerable<Employee>>> Search(string name, Gender? gender)
    {
        try
        {
            var result = await employeeRepository.Search(name, gender);

            if (result.Any())
            {
                return Ok(result);
            }

            return NotFound();
        }
        catch (Exception)
        {
            return StatusCode(StatusCodes.Status500InternalServerError,
                "Error retrieving data from the database");
        }
    }
}

코드 설명

EmployeesController 의 [ Route ] 속성 에 따라 이 컨트롤러에 접근하는 경로는 /api/employees 입니다.

[Route("api/[controller]")]
[ApiController]
public class EmployeesController : ControllerBase
{
}

다음 [HttpGet] 특성은 기본 경로 /api/employees 에 대해 고정입니다. 따라서 이 Search() 메서드에 접근하는 경로는 /api/employees/search 입니다 . 메서드의 두 매개 변수의 값은 URL의 쿼리 문자열에서 가져옵니다.

[HttpGet("{search}")]
public async Task<ActionResult<IEnumerable<Employee>>> Search(string name, Gender? gender)
{
}

쿼리 문자열 대신 검색어 (이름 및 성별) 를 경로 매개 변수로 포함하려면 아래와 같이 HttpGet 특성의 경로 템플릿을 변경합니다. 그러나 검색 매개변수가 많은 경우에는 이 방법을 사용하지 않는 것이 좋습니다.

[HttpGet("{search}/{name}/{gender?}")]
public async Task<ActionResult<IEnumerable<Employee>>> Search(string name, Gender? gender)
{
}

경로 매개변수와 메소드 매개변수는 이름으로 매핑되기 때문에 순서가 일치하지 않더라도 여전히 올바르게 매핑됩니다. 즉, URL 매개변수 이름은 메소드 매개변수 이름에 매핑되고 성별 URL 매개변수는 성별 메서드 매개변수에 매핑됩니다.

[HttpGet("{search}/{name}/{gender?}")]
public async Task<ActionResult<IEnumerable<Employee>>> Search(Gender? gender, string name)
{
}

IEmployeeRepository Interface 구성

public interface IEmployeeRepository
{
    Task<IEnumerable<Employee>> Search(string name, Gender? gender);
}

EmployeeRepository 에서 코드 처리

public class EmployeeRepository : IEmployeeRepository
{
    private readonly AppDbContext appDbContext;

    public EmployeeRepository(AppDbContext appDbContext)
    {
        this.appDbContext = appDbContext;
    }

    public async Task<IEnumerable<Employee>> Search(string name, Gender? gender)
    {
        IQueryable<Employee> query = appDbContext.Employees;
            
        if (!string.IsNullOrEmpty(name))
        {
            query = query.Where(e => e.FirstName.Contains(name)
                        || e.LastName.Contains(name));
        }

        if(gender != null)
        {
            query = query.Where(e => e.Gender == gender);
        }

        return await query.ToListAsync();
    }
}

인자로 받은 내용으로 검색하여 결과를 반환합니다.

답글 남기기