我正在使用Django rest框架编写一些rest API,其中我有两个主要资源Store
和Product
。
现在这些资源的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约定的情况下实施此方法,请告诉我。
答案 0 :(得分:0)
此请求:
POST /stores/:storeid/products/
可以将 product_id 作为返回URI的一部分公开:
Location: /stores/{storeid}/products/{productid}
它不需要告诉您数据库中映射行的技术ID。请记住,您不必在REST API中一对一地公开数据库行。
作为旁注,如果您的客户端是超文本驱动的(因为它们应该是),他们不必手动解析或构造URI,因此在URI中公开的内容并不重要。