내용 협상은 사용 가능한 표현이 여러 개 있을 때 주어진 응답에 가장 적합한 표현을 선택하는 프로세스입니다. 즉, 요청의 Accept 헤더 값에 따라 서버가 응답을 보냅니다. HTTP에서 콘텐츠 협상을 위한 기본 메커니즘은 다음과 같은 요청 헤더입니다. -
수락 − "application/json", "application/xml"과 같은 응답에 허용되는 미디어 유형 또는 "application/vnd.example+xml"과 같은 사용자 지정 미디어 유형
Accept-Charset − UTF-8 또는 ISO 8859-1과 같이 허용되는 문자 세트.
인코딩 수락 − gzip과 같이 허용되는 콘텐츠 인코딩.
허용 언어 − "en-us"와 같은 선호하는 자연어.
서버는 HTTP 요청의 다른 부분도 볼 수 있습니다. 예를 들어 요청에 AJAX 요청을 나타내는 X-Requested-With 헤더가 포함된 경우 Accept 헤더가 없으면 서버는 기본적으로 JSON으로 설정될 수 있습니다.
콘텐츠 협상에서 파이프라인은 HttpConfiguration 개체에서 IContentNegotiator 서비스를 가져옵니다. 또한 HttpConfiguration.Formatters 컬렉션에서 미디어 포맷터 목록을 가져옵니다.
다음으로 파이프라인은 IContentNegotiator.Negotiate를 호출하여 −
를 전달합니다.- 직렬화할 개체 유형
- 미디어 포맷터 모음
- HTTP 요청
Negotiate 메서드는 두 가지 정보를 반환합니다. -
- 사용할 포맷터
- 응답의 미디어 유형
포맷터가 없으면 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 서비스의 표준 중 하나는 클라이언트가 XML, JSON 등의 응답을 원하는 형식을 결정할 수 있어야 한다는 것입니다. 서버로 전송되는 요청에는 Accept 헤더가 포함됩니다. 클라이언트는 Accept 헤더를 사용하여 응답 형식을 지정할 수 있습니다. 예를 들어
Accept: application/xml returns XML Accept: application/json returns JSON
아래 출력은 Accept Header asapplication/XML을 전달할 때 응답이 XML임을 보여줍니다.
아래 출력은 Accept Header asapplication/JSON을 전달할 때 응답이 JSON임을 보여줍니다.
응답이 요청된 형식으로 클라이언트에 전송될 때 응답의 Content-Type 헤더가 적절한 값으로 설정되어 있는지 확인합니다. 예를 들어 클라이언트가 application/xml을 요청한 경우 서버는 데이터를 XML 형식으로 보내고 Content-Type=application/xml도 설정합니다.
품질 요소를 지정할 수도 있습니다. 아래 예에서 xml은 json보다 더 높은 qualityfactor를 가지므로 서버는 XML formatter를 사용하고 XML.application/xml;q=0.8,application/json;q=0.5
의 데이터 형식을 지정합니다.