0

У меня есть проблема, чтобы правильно и правильно представлять ресурсы в режиме отдыха 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}, но для этого требуется два запроса от клиента, и это может быть экспансивный.

Как вы думаете?

спасибо за ответы и извините за мой плохой английский

ответ

1

Использование гипермедиа и включить ссылку на суб-коллекции либо более категорий или продуктов.

  • Если ответ содержит ссылку «категории», то клиент знает, что он будет опускаться на следующий уровень категорий, следуя этой ссылке.

  • Если ответ содержит ссылку «продукты», то клиент знает, что он может получить все продукты для текущей категории, следуя этой ссылке.

Было бы естественным, если бы эти ссылки ссылались на разные ресурсы (как вы сами предлагаете).

Hypermedia, конечно же, не является обязательным требованием - вы можете сделать то же самое с булевым флагом и жестко закодированными знаниями клиента о возможных URL-адресах.

Другой подход должен был бы вернуться как категории и продукты в той же ответ:

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

Это решение позволит вам выставить продукцию в категориях без листьев.

Возврат или нет «404 Не найдено» - это старая дискуссия без авторитетного ответа. Некоторые люди предпочитают возвращать 200 OK с пустым списком (без подкатегорий) - другие предпочитают 404 Не найдено (нет набора подкатегорий).

+0

Я думаю, что это могло бы быть лучшим решением "вы можете сделать то же самое с булевым флагом и жестко закодированными знаниями клиента о возможных URL-адресах" Спасибо за ответ! –

Смежные вопросы