22

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

これは、うまくいけば私の言いたいことを示す例です。ユーザーが他のユーザーから商品を購入できる Web サービスがあるとします。したがって、この単純なケースでは、2 つの最上位リソースusersproductsがあります。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 を解釈する必要があるため、ルーティングをどのように処理しますか?

4

2 に答える 2

27

目標は、便利なリソース識別子を作成することです。すべてを相互参照しようとしないでください。URL表現でデータベース関係を繰り返す必要はありません:)

/product/{id}/buyerそのリソースの識別子が既に存在するため、次のようなリンクは存在しないはずです。/user/{id}

/product/{id}/buyers-listバイヤーのリストは、他のコンテキストには存在しない製品のプロパティであるため、持っていても問題ありません。

于 2013-03-08T23:26:05.957 に答える
16

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

これは、エンドポイントが通常 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

ID のリスト (製品 API を介して取得できます) を返すか、必要に応じて返送する前に製品を入力することができます。それらを移入することを選択した場合、おそらく、各製品によって参照されるユーザーを移入しないでください。これは循環インクルードにつながり、間違っています。

製品の場合、あなたの状況では次を使用します。

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
于 2013-03-08T23:37:34.097 に答える