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

ASP.NET Web API C#에서 콘텐츠 협상(Content Negotiation)이란 무엇인가?

콘텐츠 협상(Content Negotiation)이란?

콘텐츠 협상(Content Negotiation)은 하나의 응답에 대해 여러 가지 표현 방식(XML, JSON 등)이 존재할 때, 그중 가장 적합한 표현을 선택하는 과정을 말합니다. 즉, 클라이언트가 요청에 담아 보낸 Accept 헤더 값에 따라 서버가 응답 형식을 결정하여 전송하는 것입니다.

HTTP에서 콘텐츠 협상의 핵심 메커니즘은 다음과 같은 요청 헤더들입니다.

주요 요청 헤더

Accept – 응답으로 허용 가능한 미디어 타입을 지정합니다. 예를 들어 "application/json", "application/xml" 또는 "application/vnd.example+xml" 같은 커스텀 미디어 타입이 있습니다.

Accept-Charset – 허용 가능한 문자 집합을 지정합니다. 예: UTF-8, ISO 8859-1.

Accept-Encoding – 허용 가능한 콘텐츠 인코딩 방식을 지정합니다. 예: gzip.

Accept-Language – 선호하는 자연 언어를 지정합니다. 예: "ko-kr", "en-us".

서버의 추가 판단 기준

서버는 HTTP 요청의 다른 부분도 참고할 수 있습니다. 예를 들어, 요청에 AJAX 요청임을 나타내는 X-Requested-With 헤더가 포함되어 있고 Accept 헤더가 없다면, 서버는 기본적으로 JSON 형식으로 응답할 수 있습니다.

콘텐츠 협상의 내부 동작 과정

콘텐츠 협상이 진행될 때 파이프라인은 HttpConfiguration 객체로부터 IContentNegotiator 서비스를 가져오고, HttpConfiguration.Formatters 컬렉션에서 미디어 포매터 목록을 조회합니다.

그다음 파이프라인은 IContentNegotiator.Negotiate 메서드를 호출하며 다음 세 가지를 인자로 전달합니다.

  • 직렬화할 객체의 타입
  • 미디어 포매터 컬렉션
  • HTTP 요청 정보

Negotiate 메서드는 두 가지 정보를 반환합니다.

  • 사용할 포매터(Formatter)
  • 응답에 사용할 미디어 타입

만약 적합한 포매터를 찾지 못하면 Negotiate 메서드는 null을 반환하고, 클라이언트는 HTTP 406 (Not Acceptable) 오류를 받게 됩니다.

예제 코드: StudentController

using DemoWebApplication.Models;
using System;
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"
            }
        };
    }
}

RESTful 서비스와 Accept 헤더

RESTful 서비스의 중요한 표준 중 하나는, 클라이언트가 응답 형식(XML, JSON 등)을 직접 선택할 수 있어야 한다는 것입니다. 서버로 전송되는 요청에는 Accept 헤더가 포함되며, 이 헤더를 통해 클라이언트는 원하는 응답 형식을 지정할 수 있습니다.

Accept: application/xml → XML 형식으로 응답 반환
Accept: application/json → JSON 형식으로 응답 반환

아래 출력 결과는 Accept 헤더를 application/xml로 지정했을 때 응답이 XML 형식으로 반환되는 모습입니다.

ASP.NET Web API C#에서 콘텐츠 협상(Content Negotiation)이란 무엇인가?

다음 출력 결과는 Accept 헤더를 application/json으로 지정했을 때 응답이 JSON 형식으로 반환되는 모습입니다.

ASP.NET Web API C#에서 콘텐츠 협상(Content Negotiation)이란 무엇인가?

Content-Type 헤더 설정

서버가 요청된 형식대로 응답을 클라이언트에 보낼 때는, 응답의 Content-Type 헤더도 그에 맞는 값으로 설정된다는 점에 주목해야 합니다. 예를 들어 클라이언트가 application/xml을 요청했다면, 서버는 데이터를 XML 형식으로 전송하고 Content-Type=application/xml로 설정합니다.

ASP.NET Web API C#에서 콘텐츠 협상(Content Negotiation)이란 무엇인가?

품질 계수(Quality Factor) 활용하기

Accept 헤더에는 품질 계수(q값)를 지정할 수도 있습니다. 아래 예시에서는 xml의 품질 계수가 json보다 높기 때문에, 서버는 XML 포매터를 사용하여 데이터를 XML 형식으로 직렬화합니다.

application/xml;q=0.8,application/json;q=0.5

ASP.NET Web API C#에서 콘텐츠 협상(Content Negotiation)이란 무엇인가?

이처럼 ASP.NET Web API의 콘텐츠 협상은 Accept 헤더와 품질 계수를 기반으로 클라이언트에게 가장 적합한 응답 형식을 유연하게 제공하는 강력한 메커니즘입니다.