2009-11-21 3 views
5

Sun Cloud API (http://kenai.com/projects/suncloudapis/pages/Home)는 RESTful API를 따르는 좋은 예입니다. RESTful 원칙에 충실하면서, 리소스를 얻었을 때 그 리소스의 표현보다 많지도 작지도 않습니다.RESTful API를위한 Mimetype

응답의 Content-Type 헤더는 해당 리소스의 유형을 정확히 알려줍니다 (예 : application/vnd.com.sun.cloud.Snapshot + json). Sun은 이러한 mimetype을 IANA에 등록했습니다.

현재 일반적으로 얼마나 실용적입니까? 내가 본 대부분의 API는 "application/json"의 Content-Type을 사용했습니다. 이것은 응답이 JSON이지만 그 이상은 아니라는 것을 알려줍니다. "type"속성과 같이 JSON 개체에 무엇이 있는지 알아야합니다.

저는 공개 API가 설계되지 않았기 때문에 mimetypes를 등록하지 않을 것입니다. 나는 RESTEasy를 사용하고 있는데, 비록 완전한 MIME 타입을 지정했다 할지라도, 응답 헤더의 Content-Type은 정확히 Accept 요청 헤더가 지정한 것이 될 것이다. 요청이 "application/* + json"을 요청하면 기본적으로 응답 헤더에 "application/* + json"이 포함됩니다. 응답을 보내기 전에 헤더를 변경하여이 문제를 해결할 수는 있지만이를 시도해야합니까? 요청에 대한 응답과 마찬가지로 응답에 와일드 카드가 있어야합니까?

아니면 대부분의 API처럼 "application/json"을 제공해야합니까?

추가 생각은 나중에 추가 :

질문을 진술하는 또 다른 방법은 다음과 같습니다 나는 프로토콜로 HTTP를 사용하는 경우, 또는 내가 HTTP 단지 내 자신의 프로토콜을 포장하는 전송 메커니즘으로 사용해야합니까?

HTTP를 프로토콜로 사용하려면 응답의 엔터티 본문에 요청한 개체의 표현 (또는 오류 메시지 개체의 표현)이 들어 있고 "Content-Type"머리글에는 개체의 정확한 유형이 들어 있으며, "Status"헤더에는 성공 또는 오류 코드가 들어 있습니다.

HTTP를 단순히 전송 메커니즘으로 사용하려면 "Status"헤더가 항상 200 OK로 설정되고 "Content-Type"은 "application/json"과 같은 일반 사항이며 엔터티 본문에는 객체, 객체 유형, 오류 코드 등 원하는 것을 선택하십시오. 자신의 프로토콜이 RESTful 인 경우 전체 스키마가 RESTful입니다. (HTTP는 RESTful 프로토콜이지만 가능한 유일한 프로토콜은 아닙니다.)

자신의 프로토콜은 모든 전송 계층에 불투명합니다. HTTP를 프로토콜로 사용하면 모든 전송 계층에서이를 이해하고 원하지 않는 일을 할 수 있습니다. 예를 들어, 브라우저가 "401 Unauthorized"응답을 가로 채고 직접 처리하려는 경우에도 로그인 대화 상자를 표시합니다.

답변

2

아니면 대부분의 API처럼 "application/json"을 제공해야합니까?

나는 그렇게 생각하지 않는다.

RESTful 웹 응용 프로그램과이 응용 프로그램을 사용하는 클라이언트를 연결하는 유일한 방법은 미디어 유형입니다. 미디어 유형에 대한 문서는 API의 문서입니다. 미디어 유형은 클라이언트와 애플리케이션 간의 계약입니다. 특정 미디어 유형을 제거하면 REST를 실행할 수있는 중요한 요소를 제거 할 수 있습니다.

Sun은 이러한 mimetype을 IANA에 등록했습니다.

any mention of that here을 찾을 수 없습니다. AFAIK, 사용자 지정 미디어 유형을 IANA에 실제로 등록 할 필요는 없습니다. 규칙은 네임 스페이스 충돌을 방지하는 application/vnd.com.example.app.foo + json의 변환 된 도메인 표기법을 사용하는 것으로 보입니다. 미디어 유형이 안정되고 공개되는 경우 좋은 생각 일 수 있지만 요구 사항은 없습니다. 그래도 틀릴 수 있습니다.

+0

웹 클라이언트에서 가지고있는 한 가지 문제점은 HTTP 상태 코드와 헤더의 브라우저 차단입니다. 예를 들어 401 Unauthorized를 반환하면 브라우저에서 브라우저를 점유하고 자체 로그인 대화 상자를 표시하기 전에 자바 스크립트 클라이언트가이를 확인하지 못합니다. 그 때부터 브라우저는 모든 요청에 ​​대해 자체 Authorization 헤더를 넣습니다. Mimetypes는 OK를 통과하지만 하나 이상의 상태 코드 (401)가 문제입니다. –

0

완전한 mimetype을 지정하여 값을 얻을 수 있습니까? mimetype이 application/json 인 경우와는 다른 완전한 mimetype을 사용하여 작업을 수행하겠습니까?

내 2 센트 - API가 공개되지 않으면 전체 mimetype이 표시되지 않습니다. application/json의 mimetype이 충분해야합니다. 응답이 반환하는 json 유형을 이미 알고 있습니다. API가 궁극적으로 공개되면 완전한 mimetype에 대해 걱정하거나 사람들이 알아낼 수있게하십시오.

+0

리치가 언급 할 때 마임 유형은 계약서입니다. 애플리케이션의 전체 의미 론적 가치는 MIME 유형에 포함됩니다. application/json 만 제공하면 대역 외 결합을 도입하지 않고도 클라이언트가 데이터에서 얻을 수있는 가치를 거의 얻을 수 없으며 정확하게 REST가 막으려 고 시도하는 부분입니다. –

4

많은 표현을 위해 내 자신의 vnd.mycompany.mymediatype + xml 미디어 유형을 사용합니다. 클라이언트에서 반환 된 표현의 미디어 유형을 기반으로 적절한 컨트롤러 클래스로 디스패치합니다. 이것은 실제로 서버가 링크를 따르는 사용자에 대한 응답으로 내 클라이언트 응용 프로그램의 동작을 제어 할 수있게합니다.

개인적으로 REST 클라이언트를 지원하려는 경우 application/xml 및 application/json을 사용하는 것이 최악의 선택 사항 중 하나라고 개인적으로 생각합니다. 유일한 예외는 클라이언트가 다운로드 한 코드 (예 : 자바 스크립트)를 사용하여 데이터를 해석하는 경우입니다.

관련 문제