同一 URI REST 的不同资源

Different resource for the same URI REST

我在休息时正确有效地表示资源时遇到问题 api。 我的数据库中有两个表产品和类别,类别以层次​​结构方式存储:id_categoryparent_id 以及 "leafs" 类别 "contain" 产品。 客户按 .../api/categories/sub/{parentid}.

浏览类别

在服务器中我做了一个像这样的查询 SELECT id_cat, name_cat FROM categories WHERE parent_id = {parentid} 和这个 returns 子类别给客户并且没问题,但是当客户点击叶类别时我必须显示与此类别和客户请求相关的产品是相同的 .../api/categories/sub/{parentid},在这种情况下,此请求生成产品列表而不是子类别列表!!!

示例在 php 和 Slim

$app->get(
'/categories/sub/:parentid',
function ($parentid) {
    $sql = "select idcat, nome_categoria FROM categorie WHERE parentid =".$parentid;
    try {
        $db = getConnection();
        $stmt = $db->query($sql);
        $cat = $stmt->fetchAll(PDO::FETCH_ASSOC);
        $db = null;
        if (count($cat)>0) {

            deliver_response("sub categories", $cat);

        } else {
            $sql = "select p.nome_prodotto FROM categorie AS c JOIN cat_to_prod AS k ON c.idcat = k.idcat JOIN prodotti AS p ON k.codprod = p.codprod WHERE c.idcat = ".$parentid;
            $db = getConnection();
            $stmt = $db->query($sql);
            $prod = $stmt->fetchAll(PDO::FETCH_ASSOC);
            $db = null;
            if (count($prod)>0) {

                deliver_response("products", $prod);

            } else {

                deliver_response("no products found", null);

            }
        }
    } catch(PDOException $e) {
        echo '{"error":{"text":'. $e->getMessage() .'}}';
    }
}   

);

我认为休息解决方案是错误的,但如何解决呢? 我的想法是 return 一个 "not found message" 当客户端在叶类别上发出请求 ../api/categories/sub/{parentid} 并发送另一个请求以显示具有 URI .../products/category/{id_leaf_category} 的类别的产品但是这需要客户提出两个请求,而且可能会很大。

你怎么看?

感谢您的回复,抱歉我的英语不好

使用超媒体并将 link 添加到更多类别或产品的子集合中。

  • 如果响应包含 "categories" link,则客户端知道它将按照 link.[= 进入下一级类别11=]

  • 如果响应包含 "products" link 那么客户端知道它可以按照 link.[= 获得当前类别的所有产品。 11=]

让这些 link 引用不同的资源是很自然的(正如您自己建议的那样)。

超媒体当然不是必需的 - 您可以使用布尔标志和对可能 URL 的硬编码客户端知识来做同样的事情。

另一种方法是 return 类别 产品在同一响应中:

{
  "products": [ array of products, possibly empty ],
  "categories": [ array of sub-categories (including links to them), possibly empty ],
}

此解决方案可让您展示非叶类别中的产品。

是否return“404 Not found”是一个没有权威答案的古老争论。有些人更喜欢 return 200 OK 有一个空列表(没有子类别)-其他人更喜欢 404 Not found(没有子类别的集合)。