Я разрабатываю REST API, где некоторые ресурсы можно фильтровать по параметрам запроса. В некоторых случаях эти значения фильтра могут быть ресурсами одного и того же REST API. Это делает длинные и довольно нечитаемые URI. Хотя это само по себе не является большой проблемой, поскольку URI должны создаваться и управляться программно, это приводит к некоторой болезненной отладке. Я думал о том, чтобы разрешить ярлыки для URI, используемых в качестве значений фильтра, и мне интересно, разрешено ли это в соответствии с архитектурой REST и есть ли лучшие рекомендации.
Например:
У меня есть ресурс, который дает мне классы Java. Тогда следующий запрос даст мне все классы Java:
GET http://example.org/api/v1/class
Предположим, мне нужны все подклассы Collection
класса Java, тогда я бы использовал следующий запрос:
GET http://example.org/api/v1/class?has-supertype=http://example.org/api/v1/class/collection
Этот запрос вернул бы меня Vector
, ArrayList
и все другие подклассы Collection
Java-класса.
Этот URI довольно длинный, хотя. Я мог бы уже сократить его, допустив hs
в качестве псевдонима для has-supertype
. Это дало бы мне:
GET http://example.org/api/v1/class?hs=http://example.org/api/v1/class/collection
Другой способ разрешить более короткие URI - разрешить псевдонимы для префиксов URI. Например, я мог бы определить class
как псевдоним для префикса URI http://example.org/api/v1/class/
. Что даст мне следующую возможность:
GET http://example.org/api/v1/class?hs=class:collection
Другой возможностью было бы полное удаление псевдонима класса и всегда добавление значения параметра к http://example.org/api/v1/class/
, так как это единственное, что я бы поддержал. Это превратит запрос для всех подтипов Collection
в:
GET http://example.org/api/v1/class?hs=collection
Соответствуют ли эти "упрощения" исходного URI запроса принципам архитектуры REST? Или я просто ушел в глубокий конец?
ДОПОЛНЕНИЕ:
В URI может быть несколько фильтров одновременно. Либо в качестве разных параметров, либо в виде списка значений для одного параметра.
Подумайте так: «Все классы, которые реализуют Интерфейс X и / или Интерфейс Y» или «Все классы, которые реализуют Интерфейс X и находятся в пакете A.B.C» (где пакеты также могут быть адресованы URI, например http://example.org/api/v1/packages/a/b/c
)