2015-01-23 12 views
1

다음과 같이 URL에 리소스가 있다고 가정 해 보겠습니다. foo.com/api/bar 그리고 사용자가 해당 리소스를 가져올 수는 있지만 해당 리소스를 POST 할 수는 없다고 가정합니다.클라이언트에서 휴식을 취하는 동사의 사용 권한을 처리하는 방법은 무엇입니까?

나는 동사마다 다른 권한을 지정함으로써 쉽게 해결할 수 있습니다. 그러나 POST를 수행하도록 허용 된 경우 클라이언트가 어떻게 알 수 있습니까?

페이지에 "저장"버튼이 있습니다. 사용자가 POST를 수행 할 수있는 권한이없는 경우 활성화하지 않아야합니다.

나는 HATEOAS/Hypermedia 제약에 대해 알고 있으며 리소스와 함께 다른 동작에 대한 링크 목록을 전달할 수 있습니다. 그러나 AFAIK는 사용할 동사에 대한 정보를 가지고 있지 않으며, 다른 동작에 대한 URL 만 가지고 있습니다. 동사가 포함 된 다른 변형이 있습니까?

모든 종류의 메타 데이터로 리소스를 혼란스럽게하지 않으려면 다른 방법이 있습니까?

답변

1

이것은 동사가 반환되지 않는다는 사실은 내가 추측하고있어 사용중인 하이퍼 미디어 형식, HAL 인의 결정이다 포럼을 https://groups.google.com/forum/#!forum/hal-discuss

을 논의 HAL에 많이 요청 (또는 어쩌면되었습니다 컬렉션 + json). 일부 형식 DO에는 동사 정보가 포함됩니다.

실제로 HAL을 사용하면 원할 경우 링크 개체에 사용자 지정 필드를 포함시킬 수 있지만 표준 클라이언트는이를 해석하는 방법을 모르기 때문에이를 권장하지 않습니다.

그러나 나는 결국 동사가 무가치하다는 것을 알았습니다.

먼저 인간 2 기계에서 사용자는 설명서를 읽습니다. HAL은 다른 매개 변수, 동사, 헤더 등으로 해당 링크를 요청할 때의 효과를 설명하는 사람이 읽을 수있는 문서로 링크를 역 참조합니다 (CURIE는 현재 없음).

다음은 해당 용도에 대한 것입니다. 진정으로 RESTful이기 위해서는 모든 동사에 응답해야합니다 ... 동사가 OK라는 응답을하지 못할 수도 있습니다. 405를 반환하는 HTTP 기반 앱의 경우 매우 적절합니다. 404를 반환하는 것은 아닙니다! 500은 더 나쁠 것입니다. 405 번에는 요청한 리소스에 사용할 수있는 메소드가 포함되어야합니다.

다음 기계 2 기계 (및 h2m 비트)의 경우 HTTP를 통해 액세스 할 때 응용 프로그램 (RESTful 응용 프로그램이 반드시 HTTP가 아닌 것처럼 대답에 http를 피하려고합니다. 그들 중 %는 가능한 일에 대한 설명을 얻기 위해 자원 URL에 대해 OPTIONS 메소드 (http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html)를 사용해야합니다.

여기 내가 많은 사람들이 번민하고있는 것을 보았습니다. OPTIONS의 응답은 무엇입니까? 사람들이 잊는 것은 콘텐츠 유형 협상입니다. 요청자는 그들이 기대하는 옵션 정보의 형식을 말해야합니다. 수락 : some-machine-language/xml 또는 application/language + json. 일부 RFC 또는 표준은 이러한 컨텐트 유형을 정의하며 API는 지원하는 형식을 식별 할 수 있습니다. 텍스트/HTML에 대한 지원을 포함 시켜서 사람이 읽을 수있는 문서뿐만 아니라 어떤 동사가 지원되는지 알려줄 것을 제안합니다. 이것은 h2m 시나리오를 훌륭하게 다룹니다.

동일한 콘텐츠 형식 협상은 지원되지 않는 메서드에 대한 정보를 반환 할 때 유용 할 수 있습니다. 서버는 클라이언트가 이해할 수있는 내용 유형을 의미 론적으로 설명하는 방법을 허용 할 수 있습니다.

내가 지적하고자하는 마지막 것은 그 방법이 클라이언트의 의도를 암시하는 것입니다. 이 리소스를 PUT하거나 해당 리소스를 삭제하고 싶습니다. 서버는 요청을 받아들이고 요청으로 인해 어떤 상태 전이가 발생했는지 응답을 반환해야합니다. 따라서 API가 모든 요청에 ​​대해 클라이언트의 가능한 의도를 식별하도록하는 것은 다소 어리석은 일입니다. 클라이언트는 자신이 원하는 것을 알고 있고, 시도해야하며, 불가능하다면이를 처리해야합니다.

+0

굉장한 응답! –

0

HTTP 동사는 순수한 전송 프로토콜 동사입니다. 그것들은 당신이 질문에서 언급 한 문제 때문에 응용 기능을 수행하는 올바른 동사가 아닐 수도 있습니다. 그래서 http 동사를 사용하지 않고 다르게 접근 할 수 있는지 살펴 봅시다. applence 액션을 수행하기 위해 http 동사를 사용하면 http에서 다른 프로토콜로 이동할 필요가있을 수 있으므로 우리에게 앞으로는 제한 될 수 있습니다.

예를 들어 설명 드리겠습니다. 우리가 HATEOAS를 사용하여 Update Delete 어플리케이션에 대해 이야기하고 있다고 가정합시다. 따라서이 경우 www.abc.com/product/001 및 www.abc.com/product/002 URL로 대표되는 두 가지 제품이있는 경우 진정한 HATEOAS 상황에서 두 제품 product/001 및 product/002의 응답이 클라이언트 화면을보아야하는 경우

따라서 제품/001에 대한 응답에 응답 제품/001/삭제, 제품/001/변경 및 제품/002의 응답 제품/002/변경이있는 경우 클라이언트는 제품/001에 대한 삭제 만 표시하고 다른 두 제품에 대한 변경.

귀하의 질문에 대한 답변입니다. 이제 제품으로 적절하게 동작을 식별함으로써 역할 기반 동작을 수행 할 수 있습니다.

귀하의 질문에 답변 해 주셨으면합니다.