REST API эффективно извлекает много вложенных ресурсов

#rest

#rest

Вопрос:

Давайте предположим, что у меня есть REST API для доски объявлений с потоками и их комментариями в качестве вложенного ресурса, например

 /threads
/threads/{threadId}/comments
/threads/{threadId}/comments/{commentId}
 

Пользователь может извлекать все потоки с /threads помощью, но какой эффективный / хороший способ получить все комментарии?

Я знаю, что HAL может встраивать вложенные ресурсы непосредственно в родительский ресурс, но это, возможно, означает отправку большого количества данных по сети, даже если клиенту не нужен вложенный ресурс. Кроме того, я предполагаю, что подкачку сложно реализовать (допустим, один поток содержит много сотен сообщений).

Должна ли быть другая конечная точка, представляющая SQL-запрос where threadId in (..., ..., ...) ? Мне трудно назвать эту конечную точку строго ориентированным на ресурсы способом.

Или я должен просто позволить клиенту извлекать каждый вложенный ресурс по отдельности? Я предполагаю, что это сводится к проблеме N 1. Но, может быть, это не так уж и сложно, поскольку клиент может начать извлекать все вложенные ресурсы одновременно, и ответы должны возвращаться одновременно? Я мог бы подумать о недостатке, заключающемся в том, что это более или менее заставляет клиент API использовать неблокирующий ввод-вывод (поскольку в противном случае клиенту может потребоваться открыть 20 потоков для страницы размером 20 или даже больше), что может быть не так просто в некоторых фреймворках. Кроме того, с HTTP 1.1 разрешено только 6 одновременных запросов на TCP-соединение, верно?

На самом деле я сейчас склоняюсь к последнему варианту, уделяя особое внимание HTTP 2 и неблокирующему вводу-выводу (или даже отправке на сервер?) — хотя некоторые более простые клиенты могут не поддерживать это. По крайней мере, API будет чистым и его не нужно менять только для устранения технических трудностей.

Есть ли какой-либо другой вариант, который я пропустил?