2013-03-06 2 views
18

저는 서버 측 웹 개발에 익숙하지 않고 최근에 RESTful API를 구현하는 것에 대해 많은 것을 읽었습니다. REST API의 한 가지 측면은 클라이언트가 상호 작용할 수있는 리소스를 식별하는 URI 계층을 구조화하는 방법입니다. 특히 저는 다른 리소스 유형으로 구성된 리소스의 경우 계층 구조를 만드는 방법과 수행 할 작업을 결정하는 데 어려움을 겪고 있습니다.REST 리소스 계층을 구조화하는 방법은 무엇입니까?

다음은 희망하는 의미를 보여주는 예입니다. 사용자가 다른 사용자의 제품을 구매할 수있는 웹 서비스가 있다고 가정 해보십시오. 따라서이 간단한 경우에는 두 개의 최상위 리소스 사용자제품이 있습니다. 각 계층 참조 하위 집합에서 개체를 두 경우 모두

/products 
     /{id} 
       /name 
       /category 
       /description 
       /keywords 
       /buyer 
       /seller 

: 제품의

/users 
     /{id} 
      /location 
      /about 
      /name 
      /seller_rating 
      /bought 
      /sold 

: 여기가 URI 계층 구조, 사용자의

을 구성하기 시작했다 방법 다른 계층에있는 개체의 예를 들어 /users/{id}/bought은 일부 사용자가 구입 한 제품 목록이며 /products의 하위 집합입니다. 또한 /products/{id}/seller은 특정 제품을 판매 한 사용자를 나타냅니다.

이러한 URI의 다른 객체 또는 다른 객체의 하위 집합은 API가 /users/{id}/bought/id/description/products/{id}/buyer/location과 같은 것을 지원해야하나요? 이러한 유형의 URI가 지원되는 경우 /users/{id}/bought/{id}/buyer/bought/{id}/seller/name과 같은 것을 멈추게하거나 똑같이 뒤죽박죽이되는 것은 무엇입니까? 또한이 경우 서버의 라우터가 URI의 임의의 길이를 해석해야하므로 라우팅을 어떻게 처리합니까?

답변

22

목표는 편리한 리소스 식별자를 구축하고 모든 것을 상호 참조하지 않도록하는 것입니다. 이미 자원에 대한 식별자가 있기 때문에 당신은 URL 표현 : /product/{id}/buyer 같은

링크가 존재해서는 안됩니다에서 데이터베이스 관계를 반복 할 필요가 없습니다 : /user/{id}

/product/{id}/buyers-list이 괜찮은지하지만 때문에 구매자의 목록 다른 문맥에 존재하지 않는 제품의 속성입니다.

+0

그래서, 당신이 말하고있는 것은 시스템의 모든 자원이 정확히 ** 하나를 가지고 있다는 것입니다 :

그리고 제품에 대한

, 당신의 sitation에 내가 사용해야합니까? 왜냐하면 모든 것이 훨씬 간단 해지기 때문입니다. 위의 예에서 API를 통해 일부 제품의 판매자를 공개하고 싶다면 (제품에는 판매자가 하나뿐입니다) 무엇을 권하고 싶습니까? 나는 사람들이 * GET/products/{id} *를 사용하여 판매자와 함께 JSON 객체를 반환하도록해야 하는가? – martega

+2

'/ products/{id}'에 대한 JSON은 귀하의 편의를 위해 중첩 된 사용자 객체를 포함 할 수도 있고 해당 사용자에게 URL을 제공 할 수도 있습니다. 선택 사항이며 두 가지가 별도로 존재한다는 사실을 변경하지 않습니다. – Anri

+3

btw이면 다른 서비스의 API를 살펴 보는 것이 좋습니다. 예 : https://developer.foursquare.com/docs/venues/venues – Anri

11

각 엔터티가 생성, 읽기, 업데이트 및 삭제 (일반적으로 GET, POST, PUT 및 DELETE HTTP 동사 사용)를 지원하는 CRUD 방식으로 생각해야합니다.

즉, 엔드 포인트는 일반적으로 한 레벨 아래로 만 이동합니다. 예를 들어

사용자

GET /users  - Return a list of all users (you may not want to make this publically available) 
GET /users/:id - Return the user with that id 
POST /users  - Create a new user. Return a 201 Status Code and the newly created id (if you want) 
PUT /users/:id - Update the user with that id 
DELETE /users/:id - Delete the user with that id 

같은 /users/:id/about이 필요 가능성이 없습니다, 더 세부 사항으로 간다. 그것이 효과가있을 수도 있지만, 약간 지나치게 특이해질 수 있습니다.

아마도 귀하의 경우에 당신은에 추가 할 수 있습니다

GET /users/:id/bought - Array of products that the user bought 
GET /users/:id/sold - Array of products that the user sold 

당신은 (제품의 API를 통해 가져올 수 있습니다) 아이디의 목록을 반환 할 수, 또는 당신이 다시 경우를 보내기 전에 제품을 채울 수있는 곳 네가 원한다.이들을 채우기로 선택하면 각 제품에서 참조하는 사용자를 채우지 않아야합니다. 이것은 순환 포함으로 이어지고 잘못되었습니다. ** URI를

GET /products- Return a list of all products 
GET /products/:id - Return the products with that id 
POST /products- Create a new product. Return a 201 Status Code and the newly created id (if you want) 
PUT /products/:id - Update the product with that id 
DELETE /products/:id - Delete the product with that id 

GET /products/:id/buyers  - Array of who bought the product 
GET /products/:id/sellers - Array of everyone selling the product 
관련 문제