2016-02-01 49 views
1

我正在使用Django rest框架编写一些其他API,其中我有两个主要资源StoreProduct如何使用基于映射的资源设计Restful URI

现在对于这些资源的URI是像

列出所有门店GET /stores/
列表存储与ID GET /stores/:id/
添加一个新的商店POST /stores/
更新一些属性在商店PUT /stores/:id/

同适用于产品

列出所有亲管道GET /products/与ID GET /products/:id/

清单产品添加一个新产品POST /products/
更新一些属性的产品PUT /products/:id/

现在我想一些产品映射到一些商店一样,如果商店A的销售产品ID为1 100和商店B是卖产品编号70〜200

有了这个,我已经得到了另一个资源作为store_product_mappings

现在我可以用ID把它当作上面,使URI的这一资源作为

列出所有store_product_mappings GET /store_product_mappings/
列表store_product_mapping GET /store_product_mappings/:id/
添加新store_product_mapping POST /store_product_mappings/
更新一些属性在store_product_mapping PUT /store_product_mappings/:id/

但是现在这个映射ID不会暴露给这个API的使用者。所以,为了避免这种情况的复杂性,我想做出easilty理解URI像

要列出商店内的所有产品GET /stores/:id/products/
要列出商店GET /stores/:id/products/:product_id
内的产品要更新的产品的店内PUT /stores/:id/products/:product_id

但根据这种方法,如果我不寄出对这段URI
POST /stores/:id/products/

应该创建新的地图资源,并返回ID为映射资源,以同样的方式,将预期的映射ID时,我希望检索资源回来就好

GET /stores/:id/products/:id

但我不希望暴露映射因为它是我内部系统的一部分,API的消费者不需要担心它。我仍然在寻找Django rest框架中这种用例和资源的解决方案。

让我知道是否有人已经遇到过类似的问题,以及如何在不违反Rest API约定的前提下实现这一点。

回答

0

这个请求:

POST /stores/:storeid/products/ 

可以暴露PRODUCT_ID作为URI的一部分返回:

Location: /stores/{storeid}/products/{productid} 

它并不需要告诉你的映射行的技术ID在你的数据库。请记住,您不必在REST API中一对一公开数据库行。作为一个旁注,如果你的客户端是超文本驱动的(他们应该是这样),他们不必手动解析或构建URI,因此在URI中公开的内容并不重要。