У меня есть проблема, чтобы правильно и правильно представлять ресурсы в режиме отдыха api. У меня в моей базе данных две таблицы товаров и категорий, категории хранятся в иерархическом порядке: id_category
и parent_id
и категории "leafs" содержат "продукты". Клиенты перемещается по категориям по .../api/categories/sub/{parentid}.
Различные ресурсы для того же URI REST
На сервере я сделать запрос, как этот SELECT id_cat, name_cat FROM categories WHERE parent_id = {parentid}
, и это возвращает подкатегории для клиентов, и это нормально, но когда клиенты нажмите на категории листа я должен показать продукты, относящиеся к этой категории и запрос клиента, равны .../api/categories/sub/{parentid}
, и в этом случае этот запрос создает список продуктов, а не список подкатегорий !!!
Пример в PHP с тонким
$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() .'}}';
}
}
);
Я думаю, что это неправильно в решении для отдыха, но как его решить? Моя идея - вернуть «не найденное сообщение», когда клиенты делают запрос ../api/categories/sub/{parentid}
в категории «лист» и отправляют другой запрос, чтобы показать продукты категории с URI .../products/category/{id_leaf_category}
, но для этого требуется два запроса от клиента, и это может быть экспансивный.
Как вы думаете?
спасибо за ответы и извините за мой плохой английский
Я думаю, что это могло бы быть лучшим решением "вы можете сделать то же самое с булевым флагом и жестко закодированными знаниями клиента о возможных URL-адресах" Спасибо за ответ! –