WebAPI에서 IHttpActionResult 인터페이스 사용에 대한 내 2 센트

Microsoft의 WebAPI는 HTTP를 통해 작동 할 수있는 RESTful 서비스를 구축하기위한 프레임 워크였습니다. IHttpActionResult 인터페이스는 WebAPI 버전 2에서 도입되었으며 WebAPI 컨트롤러 메서드에서 응답을 다시 보내는 다른 방법을 제공하며 기본적으로 async 및 await를 활용합니다.

기본적으로 IHttpActionResult는 HttpResponsemessage의 팩토리입니다. IHttpActionResult 인터페이스는 System.Web.Http 네임 스페이스에 포함되며 HttpResponseMessage의 인스턴스를 비동기 적으로 만듭니다. IHttpActionResult는 Ok, BadRequest, Exception, Conflict, Redirect, NotFound 및 Unauthorized를 포함하는 사용자 지정 기본 제공 응답 모음으로 구성됩니다.

IHttpActionResult 인터페이스에는 하나의 메서드 만 포함됩니다. 이 인터페이스의 모양은 다음과 같습니다.

namespace System.Web.Http

{

    public interface IHttpActionResult

    {

        Task ExecuteAsync(CancellationToken cancellationToken);

    }

}

아래 나열된 ApiController 클래스의 도우미 메서드를 사용하여 사용자 지정 응답을 반환 할 수 있습니다.

Ok

NotFound

Exception

Unauthorized

BadRequest

Conflict

Redirect

InvalidModelState

WebAPI 컨트롤러 메서드에서 응답 반환

이 섹션에서는 IHttpActionResult를 활용하여 컨트롤러 메서드에서 응답을 다시 보내는 방법을 살펴 봅니다.

이제 다음 WebApi 컨트롤러를 고려하십시오.

public class DefaultController : ApiController

    {

        private readonly DemoRepository repository = new DemoRepository();

        public HttpResponseMessage Get(int id)

        {

            var result = repository.GetData(id);

            if (result != null)

                return Request.CreateResponse(HttpStatusCode.OK, result);

            return Request.CreateResponse(HttpStatusCode.NotFound);

        }

    }

각 경우에 적절한 상태 코드가 반환됩니다. 즉, 데이터를 사용할 수 있으면 HttpStatusCode.OK가 반환되고 데이터를 사용할 수 없으면 HttpStatusCode.NotFound가 반환됩니다.

이제 동일한 컨트롤러 메서드를 변경하여 IHttpActionResult로 응답을 반환하는 방법을 살펴 보겠습니다. 참조를 위해 컨트롤러 메서드의 업데이트 된 코드는 다음과 같습니다. HttpResponseMessage가 IHttpActionResult로 어떻게 대체되었는지 확인하십시오.

public IHttpActionResult Get(int id)

        {

            var result = repository.GetData(id);

            if (result == null)

                return NotFound();

            return Ok(result);

        }

위에 주어진 Get 메소드를 참조하십시오. 코드는 매우 간단하고 간결하며 Http 메시지가 컨트롤러에서 실제로 구성되는 방식을 추상화합니다. 그리고 여기 또 다른 예가 있습니다.

HttpResponseMessage를 반환하는 다음 코드 조각을 참조하여 성공 또는 실패를보고합니다.

public HttpResponseMessage Delete(int id)

        {

            var status = repository.Delete(id);

            if (status)

               return new HttpResponseMessage(HttpStatusCode.OK);

            return new HttpResponseMessage(HttpStatusCode.NotFound);

        }

이제 IHttpActionResult를 사용하여 동일한 작업 메서드를 리팩터링하여 코드를 훨씬 더 간결하고 간단하게 만드는 방법을 확인합니다.

public IHttpActionResult Delete(int id)

        {

            var status = repository.Delete(id);

            if (status)

              return Ok();

            return NotFound();

        }

어떤 것을 사용해야하며 그 이유는 무엇입니까?

그렇다면 응답을 다시 보낼 때 WebAPI 컨트롤러에서 HttpResponseMessage보다 IHttpActionResult를 사용해야합니까? 이 질문에 대한 제 답변입니다. 나는 항상 HttpResponseMessage보다 IHttpActionResult를 선호합니다. 그렇게하면 컨트롤러의 단위 테스트가 단순화됩니다. Http 응답을 생성하기위한 공통 로직을 다른 클래스로 이동하고 컨트롤러 메서드를 간결하고 간단하게 만들 수 있습니다. 본질적으로 Http 응답을 생성하는 낮은 수준의 세부 정보가 캡슐화됩니다.

다른 메모에서 IHttpActionResult를 사용할 때 단일 책임 원칙을 준수 할 수 있으며 작업 메서드가 Http 응답 메시지를 구성하는 대신 Http 요청 처리에 집중할 수 있다는 점을 언급 할 가치가 있습니다. 언급 할만한 또 다른 요점이 있습니다. IHttpActionResult를 활용하여 Razor에서 HTML 지원을 제공 할 수 있습니다. Razor 뷰를 구문 분석 할 수있는 사용자 지정 작업 결과를 생성하기 만하면됩니다. 사용자 지정 작업 결과를 만드는 것은 간단합니다. IHttpActionResult 인터페이스를 확장 한 다음 고유 한 버전의 ExecuteAsync 메서드를 구현하기 만하면됩니다.