2012-02-23 5 views
0

Foo 용 REST 리소스를 갖고 싶습니다. POST를 수행하여 새로운 Foo를 만들 수 있기를 원합니다.이 REST URI를 구성하는 올바른 방법은 무엇입니까?

Foz는 Fizz와 Buzz 만있을 수 있습니다 (모델은 FooFizz 및 FooBuzz가 백엔드에 있고 두 가지 모두 Foo를 확장합니다). 모든 Foz는 Fizz 또는 Buzz입니다. 다른 모델의 대부분은이 패턴을 따릅니다 (Fizz 및 Buzz의 하위 유형과 함께 일반). 단기 및 중기에는 Foos에 새로운 유형이 추가되지 않습니다. 장기적으로는 새로운 유형이 추가되기 전에이 애플리케이션이 더 이상 사용되지 않을 가능성이 있지만 가능성은 존재합니다.

어쨌든 다음은 Foos를 사용하기 위해 생각해 낸 URI 스키마입니다.

  1. POST/foo에? TYPE =

  2. POST/foo에/소다

  3. POST/소다/foo에

  4. POST/foo에-소다

  5. POST 소다/foo/{foo-id}/fizz

내 생각 :

(1)은 쿼리 문자열이 올바르게 구성되어 있기 때문에 불필요한 클라이언트 - 서버 커플 링 일 수 있습니다. 그러나 그것은 나에게 가장 이해하기 쉽습니다.

(2) 및 (3)은 개별 Foo에서 작업을 수행하기 위해 URI go/foo/{foo-id}를 보유 할 수 있기 때문에 바람직하지 않습니다.

(4) Fizzes을 필요로하고

(5) 괜찮은 제도처럼 보인다 URI 나무의 완전히 분리 된 지점이 될 버즈가 엉망 URI 트리를 수도 있지만.

답변

2

는 내가 강하게 단지 게시되는 문서의 내용에 의해 결정 되는 생성 할 foo는의 종류 (소다 또는 버즈)와 /foo에 POST를 유혹 할 것입니다. 새로 생성 된 foo (아마도 /foo/{fooId}, 아마도)를 통해 URI 로의 적절한 리다이렉트로 응답 할 것이고,이를 통해 정상적인 방법으로 사물을 조작 할 수있을 것이다.

+0

당신이 옳다고 생각합니다. 정보 전송을 위해 URI에 너무 많이 의존했을 수도 있습니다. – smcg

+0

질의 매개 변수를 POST와 혼합하는 것을 좋아하지 않습니다. 내가 그것을 볼 때마다, 나는 잘못된 디자인이 있다고 의심한다. :-) –

0

틀림없이, 저는 REST 전문가는 아니지만, 여기 내 두 센트입니다.

왜 foo/{foo-id} (으)로 소식을 올리시겠습니까? 이 경우 업데이트를 수행하는 데 더 많은 PUT이 필요합니다. ID가 실제로 생성 될 때까지 자동 생성되고 알려지지 않은 경우에만 게시해야합니다. 따라서이 경우 foo를 생성 할 때 1을 향하고 나머지는 foo를 작성하는 데 필요한 정보 일뿐입니다. 그 이후에 하위 유형 (fizz 또는 buzz)에 신경을 써야 할 필요가 있습니까? foo/{foo-id}가 개별적으로 작업하고 그 형식을 결정하는 데 충분한 정보가된다고 가정합니다.

그래서?

  1. POST/foo는 유형 = 소다 ** 당신은 어쩌면 쿼리 문자열을 제거하고 생성 데이터로의 전송,하지만 당신에게 달려있다 할 수
  2. GET/foo/{foo-id} ... 생성 된 foo를 불러오다
  3. 삭제/foo/만든 foo

그것이 적어도 내가해야 할 일이다.

+0

하위 유형은 각 하위 유형이 서로 다른 생성자를 가지며 작성하기 위해 다른 사항이 필요하기 때문에 중요합니다. 나는 (5)와 같은 POST가 다소 어리 석다는 것에 동의한다. 그리고 네, 창조 데이터를 전송하는 것은 저에게 일어났습니다. 그러나 다시 나는 Fizzes와 Buzzes에 필요한 다른 매개 변수 때문에 지저분해질 것이라고 생각했습니다. – smcg

+0

왜 다른 유형의 생성을 처리 할 팩토리 메소드가 없습니까? –

0

<soapbox>If you are really doing a RESTful architecture, then you shouldn't need to ask this question</soapbox>.

RESTful 아키텍처에는 응용 프로그램의 흐름을 지시하는 표현의 링크가 포함됩니다. 상위 자원의 하위 자원 인 새 자원을 작성하는 경우, 상위 자원의 표현에는 사용할 URL과 잠재적 동사를 알려주는 임베디드 링크가 있어야합니다.

<link rel="add-child" method="POST" href="http://foo/1234">Add a new child</link> 

당신이 다음 완전히 새로운 루트 자원을 작성하는 경우, 당신은 아마 절대 URL로 POST에 원하는 응답 문서 또는 Location 헤더 중 하나가있는 곳에서 새로운 표현을 검색하는 응용 프로그램에게 있습니다처럼 뭔가. 대상 자원은 기본적으로 응용 프로그램의 상태 시스템에 대한 "진입 점"입니다.

+0

부모 리소스가 자식 URI를 지시하기 때문에 URI 스키마가 중요하지 않다는 말입니까? 그것은 여전히 ​​백엔드에서 잘 조직되어야합니다. 공개 API 인 경우 어떻게됩니까? – smcg

+0

공용 API는 단순히 엔트리 엔드 포인트입니다. 다른 모든 URL은 리소스 표현 (예 : XML 요소, JSON 문서 등)에 포함되므로 생성자 (서버)만이 해당 정보를 알 수 있습니다. API 사용자 *는 초기 진입 점 이외의 URL을 생성해서는 안됩니다. –

+0

오 ... 나는 URL을 생성하기 위해 서버에서 URL 패턴을 사용하는 것에 반대하지 않습니다. 이는 확장 성을 유지하는 유일한 방법입니다. 제약 조건은 API 사용자가 URL 템플릿 등을 사용하여 URL을 구성하지 않는다는 것입니다. –

관련 문제