2012-06-17 2 views
4

내 애플리케이션을위한 안정적인 HTTP API를 설계하고 있습니다.Restful HTTP API를 사용하여 한 번에 두 개의 리소스 만들기

앱에 제품이있는 카테고리가 있습니다.

사용자가 카테고리 내에서 제품을 만들 수있게하고 카테고리가 존재하지 않으면 자동으로 생성되기를 원합니다. 따라서 카테고리를 별도로 생성하기위한 API는 없습니다 (제품을 사용하지 않고 카테고리를 만들지 않기 때문에).

저는 이것을 위해 API를 어떻게 디자인해야하는지 모르겠습니다. 일반적인 방법은 다음과 같습니다

1. Create a category: 
    POST /categories {"name": "Movies"} 
2. Use the new category's id to create a product: 
    POST /categories/:id/products {"name": "The Matrix"} 

나는 사용자에게 첫 번째를 노출하지 않기 때문에, 어떻게 내가 그들을 직접 제품을 만들 수 있도록해야합니까?

+0

제품을 제거하거나 카테고리에서 제품을 제거 할 수 있습니까? 그렇다면 모든 제품이 카테고리에서 제거되면 어떻게됩니까? 내보기에서 @ stinkymatt의 응답은 카테고리리스트가 계산 된 리소스 인 것처럼 보이기 때문에 직접적으로 편집하는 것이 아닙니다. – nicodemus13

+0

내부의 모든 제품이 제거되면 범주 제거에 대해 생각했습니다. 누군가가 DELETE/products/: id를 통해 제거 할 때 추가 로직을 추가 할 수 있습니다.이 ID는 카테고리가 비어 있으면 삭제 후에 점검합니다. 그렇다면, 나는 그것을 제거합니다. 직접 카테고리로 처리 할 필요가 없습니다. – wingy

답변

4

제품은 카테고리의 종속 리소스가 아니어야합니다. 제품이 속한 범주 목록으로 새 제품을 만든 다음/categories 리소스를 사용하여 범주를 찾아보십시오. 새 범주는 제품 범주 목록에 새 항목이 나타날 때 부작용으로 추가됩니다.

1. Create product: 
PUT /product/the_matrix {"name":"The Matrix","category_list":["movies","science fiction"]} 

2. Browse categories: 
GET /categories 
+0

예, 적절합니다. 카테고리는 생성 된 제품의 "태그"입니다. Btw. 대신 POST/제품을 사용할 수 있습니까? 사용자가 올바른 것보다 걱정하지 말고 더 잘 찾습니다. – wingy

+0

예, POST를 완벽하게 사용합니다. 나는 행복하다. – stinkymatt

+0

나는 비슷한 문제가 있으며 이것으로 내 생각을 입증했다. 내가 궁금해하는 유일한 점은 응답이 실제로 어떻게 생겼을까요? POST에 응답하려는 경우 201 Created에 Location 헤더가 있습니다. 사이드 리소스가 생성되었음을 어떻게 알리는가? 여분의 위치 헤더? – gislikonrad

0

예, 당신은 그들이 내가 사용자가 범주 내에서 제품을 만들 수 있도록하려면, 그 카테고리가 존재하지 않는 경우, 다음이 자동으로 생성 될 제품에 직접

를 만들 수 있습니다. 따라서 카테고리를 별도로 생성하기위한 API는 없습니다 (제품을 사용하지 않고 카테고리를 만들지 않기 때문에).

따라서 범주를 명시 적으로 만들 가능성은 없습니다. 그러나 내부에 제품을 생성하려면 ID가 필요합니다. 나는 해결책을 제안한다.

카테고리에는 ID가 필요합니다. 어떤면에서는 고객이 카테고리에 대해 알아야합니다. 따라서 옵션으로 카테고리 목록을 얻을 수 있습니다.

GET /categories 

어쨌든 카테고리의 또는없이 목록, 당신은 제품을 만들기 위해 사용자에게 URL을 노출 할 수 없다 : 당신이 {catIdOrName}가 존재하는지 여부를 확인해야이 운전 방식에서

POST /categories/{catIdOrName}/products 

을, 어떤을 만드는 경우 및 그것의 내부 제품. 그러나 진정한 의미에서 카테고리 생성은 분명하지 않습니다. 그러나 그런 behaivoiur는 일 수 있었다.

더 나은 방법은 내가 참조 :

  1. 동작이 카테고리의 목록을 얻을 수 있습니다.
  2. In Product 개체 - 범주가있는 속성/필드입니다. 사용자가 새로운 카테고리로 제품을 만들 때 어쨌든 당신이
  3. 카테고리 오브젝트 필드/속성에
  4. "부울 isNew",
  5. 을 분류-제품 사이의 연결을해야한다, isNew 사실과 URL에있을 것입니다 새로운 특별한 이드 사용됩니다 카테고리 또는 '새'문자열 ID.

    POST/카테고리/새/제품

  6. 요청에 이미 있지만 새로 표시 존재 카테고리가 제공

    . 반환 409보다 충돌.

  7. 제품이 URI의 실제 카테고리 ID보다 기존 제품에 오는 경우 사용됩니다.

    POST/카테고리/스포츠/제품

또는 대안으로 URI에 의해 범주와 제품 독립하게

. 또한 POST/제품별로 제품을 생성합니다. 여기서 Product 객체 카테고리가 설정되고 실행되는 동안 필요한 경우 생성됩니다. 그리고 카테고리 리소스에 대해서만 GET으로 카테고리 목록을 가져올 수 있습니다.

2

RMM의 레벨 2에 갇혀있는 것 같습니다. 레벨 3에서 하이퍼 미디어 컨트롤을 사용하면 리소스와의 유효한 상호 작용을 정의 할 수 있습니다. 예를

를 들어
GET/HTTP/1.1 

당신은 다음

HTTP/1.1 200 OK 

<products href="/products"> 
    ... 
    <create href="/products" method="post"> 
     <input name="name" type="string" cardinality="required"/> 
     <input name="category" type="string" cardinality="required"/> 
    </create> 
</products> 

당신이 수 후로 응답 할 수있는 products 링크

GET /products HTTP/1.1 

을 수행 할 수

HTTP/1.1 200 OK 
<catalogue href="/"> 
    <products href="/products"/> 
    <categories href="/categories"/> 
</catalogue> 

응답 수신제품 서버가 수신되면이 존재하고 영화 category에 매트릭스 product를 추가하지 않을 경우, 그것은 영화 category을 만들 것

POST /products HTTP/1.1 
Content-Type: application/x-www-form-urlencoded 

name=The+Matrix&category=Movies 

을 다음과 같이. 한편 초기 응답의 categories 링크를 따르면 카테고리를 검색하고 탐색 할 수있는 메커니즘이 제공 될 수 있지만 비즈니스 규칙에 따라 사용자가 빈 카테고리를 만들 수 없으므로 create 양식이 포함되지 않습니다.

자세한 내용은 REST in Practice을 참조하십시오.

관련 문제