REST API가 정말 RPC입니까? Roy Fielding은 그렇게 생각하는 것 같습니다

StackOverflow https://stackoverflow.com/questions/1164154

  •  18-09-2019
  •  | 
  •  

문제

내가 휴식에 대해 알고 있다고 생각한 많은 양은 분명히 틀렸다. 그리고 나는 혼자가 아니다. 이 질문은 긴 리드 인이지만 정보가 약간 흩어져 있기 때문에 필요한 것 같습니다. 이 주제에 이미 익숙하다면 실제 질문은 결국 발생합니다.

Roy Fielding 's의 첫 번째 단락에서 REST API는 하이퍼 텍스트 중심이어야합니다, 그가 그의 작품이 널리 해석되고 있다고 믿는 것은 분명합니다.

HTTP 기반 인터페이스를 REST API로 부르는 사람들의 수에 좌절하고 있습니다. 오늘의 예는 다음과 같습니다 SocialSite Rest API. RPC입니다. 그것은 RPC를 비명을 지른다. 디스플레이에 너무 많은 커플 링이있어 X 등급이 부여되어야합니다.

수비는 계속해서 REST API의 여러 속성을 나열합니다. 그들 중 일부는 SO와 다른 포럼에 대한 일반적인 관행과 일반적인 조언에 반대하는 것 같습니다. 예를 들어:

  • REST API는 초기 URI (북마크) 이외의 사전 지식없이 입력되어야하며 의도 된 잠재 고객에게 적합한 표준화 된 미디어 유형 세트 (즉, API를 사용할 수있는 모든 클라이언트가 이해할 것으로 예상됩니다). ...

  • REST API는 고정 된 자원 이름이나 계층 구조 (클라이언트 및 서버의 명백한 결합)를 정의해서는 안됩니다. ...

  • REST API는 리소스 및 운전 응용 프로그램 상태를 나타내는 데 사용되는 미디어 유형을 정의하거나 기존 표준 미디어 유형에 대한 확장 관계 이름 및/또는 하이퍼 텍스트 지원 마크 업을 정의하는 데 거의 모든 설명 노력을 소비해야합니다. ...

"HyperText"라는 아이디어는 URI 구조 나 HTTP 동사가 의미하는 것보다 훨씬 더 중심적인 역할을합니다. "HyperText"는 주석 중 하나에 정의됩니다.

필드링]이 하이퍼 텍스트를 말할 때, 정보가 사용자 (또는 오토마톤)가 선택을 얻고 조치를 선택하는 여유가되도록 정보와 컨트롤의 동시 프레젠테이션을 의미합니다. HyperMedia는 텍스트가 미디어 스트림에 시간적 앵커를 포함시키는 것을 의미하는 것에 대한 확장 일뿐입니다. 대부분의 연구원들은 구별을 떨어 뜨 렸습니다.

하이퍼 텍스트는 브라우저에서 HTML 일 필요가 없습니다. 기계는 데이터 형식 및 관계 유형을 이해할 때 링크를 따를 수 있습니다.

이 시점에서 추측하지만 위의 첫 두 지점은 다음과 같은 FOO 리소스에 대한 API 문서가 클라이언트와 서버 간의 단단한 커플 링으로 이어지고 편안한 시스템에 위치하지 않는다고 제안하는 것 같습니다.

GET   /foos/{id}  # read a Foo
POST  /foos/{id}  # create a Foo
PUT   /foos/{id}  # update a Foo

대신, 에이전트는 예를 들어 /foos에 대한 GET 요청을 발행함으로써 모든 푸스에 대한 URI를 발견해야합니다. (Uris는 위의 패턴을 따르는 것으로 판명 될 수 있지만 포인트 옆에 있습니다.) 응답은 각 항목에 액세스하는 방법과 그로 수행 할 수있는 내용을 전달할 수있는 미디어 유형을 사용하여 위의 세 번째 요점을 제공합니다. . 이러한 이유로 API 문서는 응답에 포함 된 하이퍼 텍스트를 해석하는 방법을 설명하는 데 중점을 두어야합니다.

또한, FOO 자원에 대한 URI가 요청 될 때마다 응답에는 에이전트가 URI를 통해 관련 및 부모 자원에 액세스하는 방법을 발견하거나 창조 후 조치를 취하는 방법을 발견하는 데 필요한 모든 정보가 포함됩니다. /자원 삭제.

전체 시스템의 핵심은 응답이 미디어 유형에 포함 된 하이퍼 텍스트로 구성되어 있으며 그 자체가 진행을위한 에이전트 옵션에 전달됩니다. 브라우저가 인간을 위해 작동하는 방식과는 다릅니다.

그러나 이것은이 특별한 순간에 나의 최선의 추측 일뿐입니다.

Fielding은 게시 a 후속 조치 그는 그의 토론이 너무 추상적이고 사례가 부족하다는 비판에 응답했다.

다른 사람들은 내가 쓴 것을 오늘날의 실질적인 관심에보다 직접적으로 적용 할 수있는 방식으로 해독하려고 노력할 것입니다. 나는 다음 주제에 너무 바쁘기 때문에, 회의 준비, 다른 표준을 작성하거나, 먼 곳으로 여행하거나, 내가 월급을 받았다고 느끼게하는 작은 일을하는 일을하기 때문에

따라서 실질적인 사고 방식으로 REST 전문가들에게 두 가지 간단한 질문이 있습니다. 필더가 무엇을 말하는지 어떻게 해석하고 REST API를 문서화/구현할 때 어떻게 실천합니까?

편집 :이 질문은 당신이 말하는 것에 대한 이름이 없다면 무언가를 배우는 것이 얼마나 어려운지의 예입니다. 이 경우 이름은 "응용 프로그램 상태의 엔진으로서의 하이퍼 미디어"(증오)입니다.

도움이 되었습니까?

해결책

나는 당신의 설명이 대부분 그것을 다루고 있다고 생각합니다. URI는 대부분의 경우 사용자 에이전트가 앱에 액세스하는 데 사용하는 북마크 URI를 넘어서 전달해서는 안되는 불투명 식별자입니다.

문서화에 관해서는,이 질문은 꽤 몇 번 이루어졌습니다. 당신은 당신의 미디어 유형을 포함하는 하이퍼 링크 컨트롤 (링크 및 양식) 및 원하는 경우 상호 작용 모델 (Atompub 참조)을 문서화합니다.

URI를 문서화하거나 구축하는 방법을 작성하면 잘못하고 있습니다.

다른 팁

당신의 해석은 나에게 옳은 것 같습니다. 필딩의 제약이 실제로 적용될 수 있다고 생각합니다.

나는 누군가가 REST 인터페이스를 문서화하는 방법에 대한 좋은 예를 게시하는 것을 정말로보고 싶습니다. 많은 가난한 사례가 있으며, 사용자가 매우 가치가 있다고 지적 할 유효한 예제가 있습니다.

나는 증오를 따르는 API의 좋은 예를 찾고 있었고 하나를 찾는 데 어려움을 겪었습니다 (SunCloud API와 Atompub 물건이 "정상적인"API 상황에 적용하기 어려운 것을 발견했습니다). 그래서 나는 블로그에서 Roy Fieldings가 적절한 휴식 구현이라는 것이 무엇을 의미하는지에 대한 조언을 따르는 현실적인 예를 만들려고 노력했습니다. 원칙적으로 상당히 간단하다는 사실에도 불구하고 예제를 생각해 내기가 매우 어렵다는 것을 알았습니다 (웹 페이지와 달리 API를 사용 할 때 혼란 스럽습니다). Roy가 문제를 겪고있는 것을 얻었고 동의합니다. API를 제대로 구현하는 것은 사고 방식의 변화 일뿐입니다.

보세요 : REST를 사용한 API 예제

URI를 구축하는 방법에 대한 지침을 제공하는 한 가지 예외는 하이퍼 텍스트 응답에서 URI 템플릿을 보내는 것이 허용되며, 하이퍼 텍스트의 다른 필드를 사용하여 필드를 클라이언트에 의해 자동으로 대체 할 수 있다는 것입니다. GZIP 압축이 URI의 반복 된 부분을 잘 처리 할 수있을 정도로 많은 대역폭을 절약하지는 않습니다.

휴식과 관련 증오에 대한 좋은 토론 :

편안한 API에서 증오를 사용하는 (또한)의 장점

커피 한 잔을 얻는 방법

관심있는 사람들을 위해, 나는 실제로 Sun Cloud API.

대부분의 사람들이 잘못한 것은 (적어도 내 생각에) 나머지 세계에서 당신은 당신의 "REST 인터페이스"를 문서화하지 않는다는 것입니다. 문서화는 서버 나 서비스와 독립적으로 미디어 유형이라는 것입니다.

절대적으로 정확합니다. 또한 패턴이 서버에서 수신 된 문서 (OpenSearch)가 적절한 예제 인 경우 패턴이 편안한 응용 프로그램 내에서 URI 템플릿이 완벽하게 잘 적합하다는 점에 주목할 것입니다. URI 템플릿의 경우 사용중인 위치와 템플릿의 예상 자리 표시자가 무엇인지, 템플릿 자체는 아닙니다. Wahnfrieden이 말한 것과 약간 반대로, 이것은 예외가 아닙니다.

예를 들어, 내 작업에는 내부 도메인 관리 시스템이 있으며 서비스 문서에는 두 개의 URI 템플릿이 지정됩니다. 하나는 도메인 리소스에 대한 최상의 추측 URI를 생성하고 다른 하나는 도메인 가용성을 쿼리하기위한 URI를 구성하기위한 URI를 제작합니다. 주어진 도메인의 URI가 무엇인지 파악하기 위해 도메인 컬렉션을 통해 페이지를 페이지에 넣을 수 있지만, 엄청난 수의 도메인을 감안할 때, 이것은 클라이언트에게는 실현 가능하지 않으므로 그들에게 무엇을 추측 할 수있는 방법을 제공합니다. 도메인 리소스의 URI는 클라이언트의 관점에서 구현의 용이성과 서버의 대역폭 측면에서 큰 승리 일 수 있습니다.

귀하의 질문에 : 우리의 규범 적 문서는 노출 된 자원, 다양한 방법의 자원에 미치는 영향, 사용 된 미디어 유형 및 스키마, 그리고 그 표현의 URI가 어떤 종류의 자원을 가리키는 지에 대한 노출 된 자원입니다.

우리는 또한 문서에 언급 된 URI에 너무 많이 읽지 말라고 면책 조항으로 첨부 된 비 규범 적 (정보) 문서를 포함하여 일반적인 클라이언트 서버 상호 작용의 예를 제공합니다. 이것은 다소 추상적 인 규범 적 문서를 구체적인 용어로 제시합니다.

나는 현재 휴식을 취한 몇 년 동안 기술자들이 자원의 개념과 실제로는 쉬운 것과 관련이 있다고 생각합니다.

Richardson 성숙도 모델에 따르면, Roy Fielding이 의도 한 것처럼 API가 얼마나 편안한 지 정의하는 4 레벨 (0-3)이 있습니다.

레벨 0은 비누처럼 하나의 진입 점 URI가있을 때입니다.

레벨 1은 API가 다른 자원을 구별 할 수 있으며, 여전히 비누 냄새가 하나 이상의 진입 지점을 가지고 있음을 의미합니다.

레벨 2는 http 동사를 사용할 때 - 주로 가져 오기, 게시, 삭제입니다. 이것은 휴식이 실제로 그림에 들어오는 수준입니다.

레벨 3에서는 하이퍼 미디어 컨트롤을 사용하여 API를 만들기 시작합니다. 진심으로 평안한.

추가 읽기를위한 제안 된 링크 :

가정하자 GET /foos/createForm 우리가 만들 때 제공 해야하는 양식 필드 값을 얻도록 호출됩니다. POST /foos . 이제이 특정 URL, 즉 푸스를 생성하는 데 사용되는 1은 응답 내에 언급되어야합니다. GET /foos/createForm Fielding의 제안에 따른 제출 조치 링크로서, 맞습니까?
그런 다음 액션을 잘 알려진 HTTP 동사 조치에 매핑 할 때 "코드/구성에 대한 협약"이 무효화됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top