Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

ASP.NET Web API(C#)에서 MIME 타입 지정하는 방법 완벽 가이드


미디어 타입(media type), 흔히 MIME 타입이라고 불리는 것은 데이터의 형식을 식별하는 역할을 합니다. HTTP에서 미디어 타입은 메시지 본문(message body)의 형식을 설명하며, '타입(type)'과 '서브타입(subtype)'이라는 두 개의 문자열로 구성됩니다. 대표적인 예는 다음과 같습니다.

  • text/html
  • image/png
  • application/json

HTTP 메시지에 엔티티 본문(entity-body)이 포함되어 있으면 Content-Type 헤더가 메시지 본문의 형식을 지정합니다. 이 헤더 덕분에 수신자는 메시지 본문의 내용을 어떻게 해석(parse)해야 할지 알 수 있습니다.

반대로 클라이언트가 요청 메시지를 보낼 때는 Accept 헤더를 포함할 수 있습니다. Accept 헤더는 클라이언트가 서버로부터 어떤 미디어 타입의 응답을 받고 싶은지 서버에 알려주는 역할을 합니다.

Accept: text/html,application/xhtml+xml,application/xml

미디어 타입은 Web API가 HTTP 메시지 본문을 직렬화(serialization)하고 역직렬화(deserialization)하는 방식을 결정합니다. ASP.NET Web API는 XML, JSON, BSON, form-urlencoded 데이터를 기본적으로 지원하며, 필요하다면 미디어 포매터(media formatter)를 직접 작성하여 추가적인 미디어 타입도 지원할 수 있습니다.

MediaTypeFormatter는 추상 클래스이며, 이를 상속받는 JsonMediaTypeFormatterXmlMediaTypeFormatter 클래스가 있습니다. JsonMediaTypeFormatter는 JSON을, XmlMediaTypeFormatter는 XML을 각각 처리합니다. 미디어 타입은 WebApiConfig 클래스의 Register 메서드에서 지정하며, 아래 예제들을 통해 다양한 활용 방법을 살펴보겠습니다.

Student 컨트롤러

예제 코드

using DemoWebApplication.Models;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;

namespace DemoWebApplication.Controllers
{
    public class StudentController : ApiController
    {
        List<Student> students = new List<Student>
        {
            new Student
            {
                Id = 1,
                Name = "Mark"
            },
            new Student
            {
                Id = 2,
                Name = "John"
            }
        };

        public IEnumerable<Student> Get()
        {
            return students;
        }
    }
}

1. Accept 헤더 값과 관계없이 항상 JSON만 반환하기

클라이언트가 어떤 Accept 헤더 값을 보내더라도 서비스가 오직 JSON만 반환하도록 하려면, XmlFormatter를 제거하면 됩니다.

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
        config.Formatters.Remove(config.Formatters.XmlFormatter);
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

위 코드처럼 XmlFormatter를 제거하면, 클라이언트 요청의 Accept 헤더 값과 무관하게 ASP.NET Web API는 항상 JSON을 반환합니다. 서비스가 XML이 아닌 JSON만 지원하길 원할 때 유용한 기법입니다.

ASP.NET Web API(C#)에서 MIME 타입 지정하는 방법 완벽 가이드

위 출력 결과를 보면, Accept 헤더 값이 application/xml이더라도 Web API 서비스는 항상 JSON으로 응답하는 것을 확인할 수 있습니다.

2. Accept 헤더 값과 관계없이 항상 XML만 반환하기

반대로 항상 XML만 반환하고 싶다면 JsonFormatter를 제거하면 됩니다.

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
        config.Formatters.Remove(config.Formatters.JsonFormatter);
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

ASP.NET Web API(C#)에서 MIME 타입 지정하는 방법 완벽 가이드

위 출력 결과를 보면, Accept 헤더 값이 application/json이더라도 Web API 서비스는 XML로 응답하는 것을 확인할 수 있습니다.

3. 브라우저에서 요청할 때 XML 대신 JSON 반환하기

브라우저에서 StudentController로 요청을 보내면 응답은 기본적으로 XML 형식입니다. 그 이유는 브라우저가 기본적으로 Accept 헤더를 text/html로 전송하기 때문입니다.

ASP.NET Web API(C#)에서 MIME 타입 지정하는 방법 완벽 가이드

그렇다면 브라우저에서 요청했을 때 XML 대신 JSON 응답을 받으려면 어떻게 해야 할까요? JsonFormatter의 SupportedMediaTypes에 text/html을 추가하면 됩니다.

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();
        config.Formatters.JsonFormatter.SupportedMediaTypes.Add(
            new MediaTypeHeaderValue("text/html"));
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

아래 출력 결과를 보면, 브라우저에서 Accept 헤더가 text/html인 요청을 보내더라도 응답이 JSON 형식으로 반환되는 것을 확인할 수 있습니다.

ASP.NET Web API(C#)에서 MIME 타입 지정하는 방법 완벽 가이드