2013-03-06 16 views
18

私はサーバーサイドのWeb開発には新しく、最近はRESTful APIの実装について多くのことを読んできました。私がまだ立ち往生しているREST APIの1つの側面は、クライアントが対話できるリソースを識別するURI階層を構造化する方法です。具体的には、他のリソースタイプで構成されているリソースの場合、どのように詳細を階層化するのか、どのようにすればよいのかを決めることに固執しています。RESTリソース階層を構造化する方法は?

ここに、私が意味することをうまく示してくれる例があります。ユーザーが他のユーザーから製品を購入できるようにするWebサービスがあるとします。したがって、この単純なケースでは、2つの最上位レベルのリソースユーザーの製品があります。ここで私は、ユーザーのために、

をURIの階層を構築し始めた方法は次のとおりです。製品について

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

:各階層の参照でこれらの例オブジェクトの両方で

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

サブセット他の階層のオブジェクトのたとえば、/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

だから、何を言っていることは、システム内のすべてのリソースが正確に** 1 ** URIを持っているということでしょうか?それはすべてをより簡単にするからです。上記の例では、いくつかの製品の販売者をapiを通じて公開する場合(商品には1つの売り手しかありません)、何をお勧めしますか?私はちょうど人々が* GET/products/{id} *を売り手と一緒にいくつかのJSONオブジェクトを返すようにする必要がありますか? – martega

+2

'/ products/{id}'のJSONには、ユーザの便宜のためにネストされたユーザオブジェクトが含まれている場合もあれば、そのユーザにURLがある場合もあります。 – Anri

+3

btw、それは他のサービスのAPIを見るのに役立ちます。例:https://developer.foursquare.com/docs/venues/venues – Anri

11

あなたは、各エンティティの作成をサポートCRUDファッション、でそれを考える読み取り、更新、および削除(通常は使用してGET、POSTを、PUT、およびそれぞれのHTTP動詞をDELETE)する必要があります。

これはあなたのエンドポイントが通常だけ深い1つのレベルに行くことを意味します。例えば

ユーザーが

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を介して取り出すことができる)IDのリストを返すことができ、またはあなたが戻ってそれらを送信する前に製品を投入する可能性がどこあなたは欲しい。これらの値を入力することを選択した場合は、各製品が参照するユーザーを入力しないでください。これは循環インクルードにつながり、間違っています。

や製品のため、ごsitationに私が使用します。

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 
関連する問題