REST를 구현할 때 REST와 관련된 몇 가지 개념이 머리에서 충돌합니다.
비즈니스 논리를 보유하는 REST-ful 백엔드 API 시스템과 UI를 제공하는 웹 응용 프로그램이 있습니다. REST에 대한 다양한 리소스 (특히 REST in Practice : Hypermedia and Systems Architecture )에서 엔티티의 원시 식별자를 공개해서는 안되고로 하이퍼 링크를 반환해야한다는 것을 알고 rel="self"
있습니다.
예를 고려하십시오. REST API에는 사람을 반환하는 리소스가 있습니다.
<Person>
<Links>
<Link rel="self" href="http://my.rest.api/api/person/1234"/>
</Links>
<Pets>
<Link rel="pet" href="http://my.rest.api/api/pet/678"/>
</Pets>
</Person>
웹 응용 프로그램에서 문제가 발생합니다. 브라우저에 대한 하이퍼 링크가 포함 된 페이지를 반환한다고 가정 해 봅시다.
<body class="person">
<p>
<a href="http://my.web.app/pet/???????" />
</p>
</body>
href
속성에 무엇을 넣어야 합니까? 사용자가 대상 페이지를 열 때 엔티티를 가져올 수 있도록 웹 애플리케이션에서 API 엔티티 URL을 유지하려면 어떻게해야합니까?
요구 사항이 상충되는 것 같습니다.
- 하이퍼 링크
href
는 UI를 호스팅하는 시스템이기 때문에 웹 응용 프로그램으로 연결되어야합니다. - 는
href
웹 응용 프로그램이 대상 페이지가 열릴 때 엔티티를 해결 할 수 있어야하기 때문에 엔티티의 일부 ID를 가지고 있어야 - 웹 응용 프로그램은 REST URL이 충분하지 않기 때문에 REST URL을 구문 분석 / 구성해서는 안됩니다.
URI는 소비자에게 불투명해야합니다. URI의 발행자 만이이를 해석하고이를 자원에 맵핑하는 방법을 알고 있습니다.
따라서 1234
RESTful 클라이언트 인 것처럼 마치 마치 API 응답 URL을 가져갈 수 없습니다 http://my.rest.api/api/AGRIDd~ryPQZ^$RjEL0j
. 반면에, 나는 내 웹 앱으로 연결되는 URL을 제공해야하며 앱이 어떻게 든 API의 원래 URL을 복원하고 해당 URL을 사용하여 API 리소스에 액세스하기에 충분합니다.
가장 간단한 방법은 아마도 리소스의 API URL을 문자열 식별자로 사용하는 것입니다. 그러나 웹 페이지 URL http://my.web.app/person/http%3A%2F%2Fmy.rest.api%2Fapi%2Fperson%2F1234
은 추악합니다.
데스크톱 앱이나 단일 페이지 자바 스크립트 앱은 매우 쉬운 것 같습니다. 지속적으로 사용되므로 애플리케이션 수명 동안 서비스 객체와 함께 URL을 메모리에 유지하고 필요할 때 사용할 수 있습니다.
웹 응용 프로그램을 사용하면 여러 가지 접근법을 상상할 수 있지만 모두 이상하게 보입니다.
- API URL에서 호스트를 교체하고 결과 만 유지하십시오. 큰 단점은 웹 응용 프로그램이 API가 생성하는 모든 URL을 처리해야한다는 것입니다. 또한 웹 응용 프로그램이 URL 해석을 시작하기 때문에 다시 RESTful하지 않습니다.
- 링크와 함께 REST API의 원시 ID를 노출하고이를 사용하여 웹 애플리케이션의 URL을 빌드 한 다음 웹 애플리케이션 서버의 ID를 사용하여 API에서 필요한 자원을 찾으십시오. 이 방법이 더 좋지만 웹 앱은 브라우저의 요청을 처리하기 위해 특정 형식의 get-by-id 요청 체인을 발행하는 REST 서비스 탐색을 거쳐야하기 때문에 웹 앱 서버 성능에 영향을 미칩니다. 다소 중첩 된 리소스의 경우 비용이 많이들 수 있습니다.
self
API가 반환 한 모든 URL을 웹앱 서버의 영구 (DB?) 매핑에 저장합니다. ID를 생성하고 ID를 사용하여 웹 앱 페이지 URL을 빌드하고 REST 서비스 자원의 URL을 가져 오십시오. 즉http://my.rest.api/pet/678
, 새 키로 URL을 어딘가에 유지하고으로3
웹 페이지 URL을 생성하십시오http://my.web.app/pet/3
. 이것은 일종의 HTTP 캐시 구현처럼 보입니다. 왜 그런지 모르겠지만 나에게는 이상해 보인다.
아니면 RESTful API가 웹 애플리케이션의 백엔드로 사용될 수 없다는 것을 의미합니까?