Web API에서 콘텐츠 협상을 사용하는 방법

ASP.Net Web API는 상태 비 저장 및 RESTful HTTP 서비스를 구축하는 데 사용되는 경량 프레임 워크입니다. RESTful 서비스는 리소스 개념을 기반으로하는 경량의 상태 비 저장 클라이언트-서버 기반의 캐시 가능한 서비스입니다. REST는 상태 비 저장 서비스를 구현하는 데 사용되는 일련의 제약 조건 인 아키텍처 스타일입니다. 재사용 가능하고 확장 가능한 서비스를 만드는 데 사용되는 아키텍처 패러다임입니다.

요청 된 형식의 리소스 표현은 다양한 유형의 장치에서 서비스를 소비하기를 원할 수 있으므로 흥미로운 주제입니다. 콘텐츠 협상은 Web API에서 가장 중요한 개념 중 하나입니다. 비교적 단순한 개념이지만이 주제에 대해 많은 오해와 오해가 있습니다. Web API를 사용하여 RESTful 서비스를 설계하고 구현할 때 종종 콘텐츠 협상을 처리해야합니다.

협상 된 콘텐츠는 무엇이며 왜 중요한가요?

콘텐츠 협상은 동일한 리소스의 여러 사용 가능한 표현 중에서 리소스의 최상의 표현을 결정하기 위해 들어오는 HTTP 요청의 구조를 검사하는 프로세스로 정의 될 수 있습니다. 본질적으로 콘텐츠 협상은 동일한 URL이 다양한 형식으로 동일한 콘텐츠를 제공 할 수 있도록하는 개념입니다. 콘텐츠 협상을 활용하여 선호하는 미디어 유형을 선택할 수 있습니다.

Web API에서 콘텐츠 협상은 클라이언트 측에서 들어오는 요청에 대한 응답을 반환하는 데 사용할 미디어 유형 포맷터를 결정하기 위해 런타임 (서버 측에서)에 의해 수행됩니다.

콘텐츠 협상은 미디어 유형 및 미디어 유형 포맷터를 중심으로합니다. 전자는 HTTP 요청 및 HTTP 응답에서 "content-type"헤더의 값을 나타내지 만 후자는 .NET 유형을 해당 HTTP 데이터로 변환하는 데 사용되며 그 반대의 경우도 마찬가지입니다. Web API의 미디어 유형 포맷터는 MediaTypeFormatter라는 추상 클래스로 표시됩니다.

Web API 프레임 워크는 기본적으로 다음 포맷터와 함께 제공됩니다.

  • System.Net.Http.Formatting.JsonMediaTypeFormatter
  • System.Net.Http.Formatting.XmlMediaTypeFormatter
  • System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter
  • System.Web.Http.ModelBinding.JQueryMvcFormUrlEncodedFormatter

Web API에서 콘텐츠 협상을 사용자 지정하려면 활용해야하는 주요 확장 성 지점은 미디어 유형 매핑입니다. Web API는 기본적으로 다음 미디어 유형 매핑과 함께 제공됩니다.

  • QueryStringMapping
  • UriPathExtensionMapping
  • RequestHeaderMapping
  • MediaRangeMapping

사용자 지정 미디어 유형 매핑을 작성하려면 아래 코드 조각에 표시된대로 MediaTypeMapping을 확장하는 클래스를 만들어야합니다.

public class MediaTypeMapping : MediaTypeMapping

{

   protected override double OnTryMatchMediaType(HttpResponseMessage response)

     {

                //Write your custom code here

     }

}

다음 코드 조각은 HttpConfiguration.Formatters 컬렉션을 반복하여 Web API에서 지원되는 모든 포맷터의 이름을 검색하는 방법을 보여줍니다.

   [HttpGet]

       public List GetAllFormatters()

       {

           List lstFormaters = new List();

           foreach (var formatter in this.Configuration.Formatters)

           {

               lstFormaters.Add(formatter.GetType().Name);

           }

           return lstFormaters;

       }

이제 콘텐츠 협상을 통해 원하는 포맷터를 선택하고 필요한 형식으로 콘텐츠를 검색하는 방법을 살펴 보겠습니다. 다음 엔티티 클래스를 고려하십시오.

public class CustomerDTO

   {

       public Int32 Id

       { get; set; }

       public string FirstName

       { get; set; }

       public string LastName

       { get; set; }

       public string Address

      { get; set; }

   }

다음으로 CustomerDTO 유형 목록에 데이터를 채우고이를 반환하는 메서드가 있다고 가정합니다.

private List GetCustomerData()

       {

           List lstCustomers = new List();

           CustomerDTO customer = new CustomerDTO();

           customer.Id = 1;

           customer.FirstName = "Joydip";

           customer.LastName = "Kanjilal";

           customer.Address = "Hyderabad, India";

           lstCustomers.Add(customer);

           return lstCustomers;

       }

다음 Web API 메서드는 사용 가능한 기본 콘텐츠 협상 메커니즘을 기반으로 웹 API 메서드의 응답으로 HttpResponseMessage를 반환하는 방법을 보여줍니다.

[HttpGet]

       public HttpResponseMessage GetCustomers()

       {

           List lstCustomers = GetCustomerData();

           IContentNegotiator negotiator = Configuration.Services.GetContentNegotiator();

           ContentNegotiationResult result = negotiator.Negotiate(typeof(CustomerDTO), Request, Configuration.Formatters);

           return new HttpResponseMessage()

           {

               Content = new ObjectContent (lstCustomers, result.Formatter, result.MediaType.MediaType)

         };

       }

포맷터 컬렉션에서 사용할 수있는 특정 포맷터를 사용하려는 경우 아래 코드 스 니펫에 표시된 것과 동일한 메서드를 다시 작성할 수 있습니다.

[HttpGet]

       public HttpResponseMessage GetCustomers()

       {

           List lstCustomers = GetCustomerData();

           return new HttpResponseMessage()

           {

               Content = new ObjectContent (lstCustomers, Configuration.Formatters[1])

           };

      }

확인; 하지만 어떻게 자신 만의 사용자 지정 포맷터를 구축합니까? 사용자 정의 미디어 유형 포맷터를 만들려면 MediaTypeFormatter 추상 클래스를 확장하는 클래스를 만들어야합니다. 그런 다음 생성 한 클래스 내에 사용자 지정 코드를 작성하여 MediaTypeFormatter 추상 기본 클래스의 메서드를 재정의해야합니다.

public class CustomMediaTypeFormatter : MediaTypeFormatter

   {

       public override bool CanReadType(Type type)

       {

           throw new NotImplementedException();

       }

       public override bool CanWriteType(Type type)

       {

           throw new NotImplementedException();

       }

   }

사용자 지정 포맷터가 배치되면 쉽게 포맷터 컬렉션에 추가 할 수 있습니다.

config.Formatters.Add(new CustomMediaTypeFormatter ());