REST объединил все записи и одну запись - PullRequest
0 голосов
/ 02 февраля 2020

Я создаю конечную точку REST, в которой есть счета. Мне нужно построить оба списка всех счетов в 3-х уровнях описания (подробное описание по умолчанию, только суммы и одно с информацией о клиентах).

Мне также нужно создать конечную точку для отдельных счетов, которая будет содержать гораздо больше информации в нем.

Я думал

GET /invoices               <-- detailed
GET /invoices?mode=sums     <-- sums
GET /invoices?mode=customer <-- sums
GET /invoices/TNTV002793849 <-- individual invoice

Но я видел, как другие реализуют два разных, может быть

GET /invoices/detailed     <-- detailed
GET /invoices/sums         <-- sums
GET /invoices/customer     <-- sums
GET /invoice/TNTV002793849 <-- individual 

Я уже знаю, прочитав, что все это может посчитать REST, и если что-то мне понадобится, чтобы сделать один со ссылками, чтобы это был HATEOAS, для которого нет реальной причины, почему я нуждаюсь в этом.

Мой вопрос больше с практической точки зрения, например, который легче реализовать , безопаснее и более распространено по соглашению.

Я, вероятно, буду использовать python с Flask для сервера, и один клиент, которого я напишу, будет JQuery, если это имеет значение.

1 Ответ

0 голосов
/ 03 февраля 2020

Как вы упомянули сами, это не имеет значения. Итак, в основном это мнение.

Предостережение с использованием /invoice/TNTV002793849 и /invoices/ состоит в том, что у вас есть 2 разных пространства имен для одной и той же концепции. Я думаю, что это несколько необычно и неожиданно. Приятно иметь возможность удалить последнюю часть URL и получить логического родителя.

Так что я бы предпочел использовать то же пространство имен верхнего уровня. Я лично также использовал бы «единственное» для всего вместо формы множественного числа, но это также просто мягкое предпочтение.

Тогда остается вопрос: если все использует префикс «счетов», если у вас есть оба /sums и /TNTV002793849. Самый большой вопрос, может ли быть столкновение? Не могли бы вы иметь счет-фактуру с именем sums. Если это правда, то это жесткое число.

Если режимы ?mode=sums и ?mode=customer очень похожи на данные родительского /invoices, вы также можете использовать контент-согласование. Если они существенно отличаются, то я чувствую, что ?mode= не так уместен и просто будет иметь совершенно разные конечные точки.

Так что все это вместе приведет меня к:

GET /invoice               <-- full list of invoices
GET /invoice/{id}          <-- a specific invoice
GET /invoice-summary       <-- Some report
GET /customer/{id}/invoice <-- All invoices for a specific customer

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

...