如何使用基于映射的资源设计Restful URI

时间:2016-02-01 11:51:15

标签: django api rest django-rest-framework

我正在使用Django rest框架编写一些rest API,其中我有两个主要资源StoreProduct

现在这些资源的URI就像

列出所有商店GET /stores/
列出标识为GET /stores/:id/的商店 添加新商店POST /stores/
更新商店中的某些属性PUT /stores/:id/

同样适用于产品

列出所有产品GET /products/
列出ID为GET /products/:id/的产品 添加新产品POST /products/
更新产品PUT /products/:id/中的一些属性

现在我想将一些产品映射到一些商店,例如商店A销售ID为1到100的商品,商店B销售ID为70到200的商品。

有了这个我有另一个资源store_product_mappings

现在我可以像上面那样对待它并为此资源制作URI

列出所有store_product_mappings GET /store_product_mappings/
列出标识为GET /store_product_mappings/:id/的store_product_mapping 添加新的store_product_mapping POST /store_product_mappings/
更新store_product_mapping PUT /store_product_mappings/:id/中的一些属性

但是现在这个映射ID并未暴露给此API的使用者。因此,为了避免这种复杂性,我想制作一个易于理解的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

但我不想公开地图ID,因为它是我内部系统的一部分,API的消费者不应该担心它。我仍在为Django休息框架中的这种用例和资源寻找解决方案。

如果有人已经遇到类似的问题以及他们能够在不违反Rest API约定的情况下实施此方法,请告诉我。

1 个答案:

答案 0 :(得分:0)

此请求:

POST /stores/:storeid/products/

可以将 product_id 作为返回URI的一部分公开:

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

它不需要告诉您数据库中映射行的技术ID。请记住,您不必在REST API中一对一地公开数据库行。

作为旁注,如果您的客户端是超文本驱动的(因为它们应该是),他们不必手动解析或构造URI,因此在URI中公开的内容并不重要。