Я разрабатываю 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
)