수색…


ASP.NET 웹 API 콘텐츠 협상 기본 정보

Content Negotiation 은 주어진 자원에 가장 적합한 표현을 선택하는 과정으로 정의 할 수 있습니다. 따라서 콘텐츠 협상이란 클라이언트와 서버가 클라이언트와 서버간에 협상을 통해 클라이언트가 필요한 형식에 따라 데이터를 가져올 수 있음을 의미합니다.

인터넷에 의존하는 세 가지 포인트가 있습니다.

  • 자원
  • 리소스 (URL)에 대한 포인터
  • 자원 표현

세 번째 요점은 다른 두 가지 요소보다 더 중요합니다. 왜냐하면 모든 것이 리소스를 볼 수있는 방법을 기반으로 작동하기 때문입니다. 자원을 두 가지 형식으로 표현할 수 있습니다.

  1. XML (Extensible Markup Language) 형식
  2. JSON (JavaScript Object Notation) 형식

RESTful 서비스의 표준 중 하나는 클라이언트가 JSON 또는 XML 형식으로 응답을 원하는 형식을 결정할 수 있어야한다는 것입니다. 서버로 전송되는 요청에는 Accept 헤더가 포함됩니다. Accept 헤더를 사용하여 클라이언트는 응답 형식을 지정할 수 있습니다.

예를 들어,

Accept: application/xml 은 결과를 XML 형식으로 반환합니다.

Accept: application/json 은 결과를 JSON 형식으로 반환합니다.

요청의 Accept 헤더 값에 따라 서버는 응답을 보냅니다. 이를 콘텐츠 협상 (Content Negotiation)이라고합니다.

특정 형식의 데이터를 요청할 때 장면 뒤에서 어떤 일이 발생합니까?

ASP.NET 웹 API 컨트롤러는 클라이언트에 보낼 데이터를 생성하고 클라이언트의 Accept 헤더를 찾는 웹 API 파이프 라인으로 데이터를 전달합니다. 그런 다음 적절한 포맷터를 선택하여 데이터를 포맷하십시오.

ASP.NET 웹 API는 확장 성이 매우 뛰어나므로 요청 헤더에 accept 헤더에 대해 여러 값을 지정할 수도 있습니다.

Accept: application/xml,application/json

위의 경우 서버는 첫 번째 포맷터를 선택하여 응답 데이터를 포맷합니다.

Accept 헤더에 품질 계수를 지정할 수도 있습니다. 이 경우 서버는 더 높은 품질 요소를 갖는 형식을 선택하십시오.

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

Accept 헤더를 지정하지 않으면 기본적으로 서버에서 JSON 포맷터를 선택합니다.

응답이 요청 된 형식으로 클라이언트에 전송되면 응답의 Content-Type 헤더가 적절한 값으로 설정되어 있는지 확인하십시오. 예를 들어 클라이언트가 application/xml 을 요청한 경우 서버는 XML 형식의 데이터를 보내고 Content-Type=application/xml 도 설정합니다.

형식 기는 요청 및 응답 메시지 모두에 대해 서버에서 사용됩니다. 클라이언트가 서버에 요청을 보내면 Content-Type 헤더를 적절한 값으로 설정하여 서버가 전송할 데이터의 형식을 알 수있게합니다.

예를 들어 클라이언트가 JSON 데이터를 보내는 경우 Content-Type 헤더는 application/json 설정됩니다. 서버는 JSON 데이터를 처리한다는 것을 알고 있기 때문에 JSON 포맷터를 사용하여 JSON 데이터를 .NET 유형으로 변환합니다. 마찬가지로 응답이 서버에서 클라이언트로 전송 될 때 Accept 헤더 값에 따라 .NET 형식을 JSON, XML 등으로 변환하는 데 적절한 형식 지정 프로그램이 사용됩니다.

다양한 유형의 응답 형식 예 :

application / json :

{
  "Email": "sample string 1",
  "HasRegistered": true,
  "LoginProvider": "sample string 3"
}

application / xml :

<UserInfoViewModel xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/WebApiDemo.Models">
  <Email>sample string 1</Email>
  <HasRegistered>true</HasRegistered>
  <LoginProvider>sample string 3</LoginProvider>
</UserInfoViewModel>

최신 웹 기반 응용 프로그램은 다양한 언어 및 형식의 데이터를 제공 할 수 있습니다. 따라서 전 세계 사용자를 대상으로 API를 개발하면 콘텐츠 협상과 관련이 있습니다.

웹 API의 콘텐츠 협상

개념 이해하기

웹 API의 컨텐츠 협상을 이해하려면 Resource 이라는 용어를 이해하는 것이 중요합니다.

웹에서는 액세스 할 수있는 모든 정보를 HTTP resource 라고 HTTP resource . html 문서, 이미지, 비디오, 오디오, 실행 파일, 스프레드 시트 등과 같이 내용 유형이 다른 웹에서 볼 수있는 엄청난 양의 자료가 있습니다. 우리는 자원 URI에 http 요청을함으로써 모든 자원을 얻을 수 있습니다. 요청에 대한 http 응답은 리소스를 반환하고 also known as media type 하는 콘텐츠 형식을 지정합니다.

모든 리소스에 액세스하기 위해 클라이언트는 특정 리소스 URI와 http 동사를 제공하여 http 요청을 할 수 있습니다. 그러나이 외에도 클라이언트는 사용자가 찾고있는 컨텐츠의 형식 인 승인 유형을 지정할 수도 있습니다. "accept-type"은 http 요청 헤더에서 “accept” 헤더로 정의 될 수 있습니다.

그런 다음 서버는 요청에서 "accept"헤더를 검사하고 사용 가능한 경우 지정된 형식으로 응답을 리턴합니다. 서버는 요청 된 표현 이 가능한 경우 에만 응답을 리턴 할 수 있습니다 . 요구 된 표현이 이용 가능하지 않은 경우는, 자원을 디폴트 표현으로 돌려줍니다. 이것이 콘텐츠 협상이라고 불리는 이유입니다.


실용적인 예

예를 들어, http://example.com/customer/1 에 ID 1 인 고객 정보를 요청한다고 가정합니다. 요청에 "accept"헤더를 지정하지 않으면 서버는이 자원의 기본 표현을 리턴합니다.

서버가 json and xml both 에서 고객 정보를 반환 할 수 있다고 가정합니다. 이제 요청에서 "accept"헤더에 고객 정보의 필수 형식을 지정하는 것이 클라이언트에서 수행됩니다. “accept” 헤더의 값은 json 표현의 경우 “application/json” 또는 xml 표현의 경우 “text/xml” 될 수 있습니다. 그러면 서버는 요청 된 형식에 따라 응답을 리턴합니다.

요청 된 형식이이 호스트에서 지원되지 않는 "text / html"인 경우 (이 예에서와 같이), simply return the resource in the default format . http 응답에는 클라이언트에게 자원의 형식에 대해 알려주는 “content-type” 헤더가 있습니다.

요청 된 리소스 표현을 사용할 수없는 경우에도 여전히 리소스의 기본 표현이 반환됩니다.

이것이 콘텐츠 협상이라고 불리는 이유 입니다.

클라이언트는 응답 표현을 협상하지만 사용 가능하지 않으면 기본 응답을 얻습니다.


웹 API에서 구성하는 방법

웹 API에서 Content Negotiation은 WebAPIConfig 클래스에서 다음과 같이 구성 할 수 있습니다.

config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("text/html"));

또한 IContentNegotiator 인터페이스와 Negotiate 메서드를 구현하여 Web API의 기본 콘텐츠 협상을 재정의 할 수 있으며 WebAPI.config 파일의 Web API 요청 파이프 라인에서 아래와 같이 설정합니다.

GlobalConfiguration.Configuration.Services.Replace(typeof(IContentNegotiator), new CustomContentNegotiator());

다음은 Negotiate 메소드의 샘플 구현입니다.

public class CustomContentNegotiator : DefaultContentNegotiator
    {
        public override ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
        {
            var result = new ContentNegotiationResult(new JsonMediaTypeFormatter(), new MediaTypeHeaderValue("application/json"));
            return result;
        }


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow