Я разрабатываю REST API, где некоторые ресурсы могут фильтроваться через параметры запроса. В некоторых случаях эти значения фильтра будут ресурсами из одного и того же REST API. Это приводит к длинным и довольно нечитаемым URI. Хотя это не слишком большая проблема сама по себе, потому что URI должны создаваться и обрабатываться программно, это приводит к некоторой болезненной отладке. Я думал о том, чтобы разрешать ярлыки для URI, используемых в качестве значений фильтра, и мне интересно, разрешено ли это в соответствии с архитектурой REST и если есть какие-либо лучшие методы.Рекомендации по использованию 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
и всех других подклассов класса Java Collection
.
Этот URI довольно длинный. Я уже мог укоротить его, разрешив hs
в качестве псевдонима для has-supertype
. Это дало бы мне:
Другой способ, чтобы позволить более короткие URIs бы, чтобы псевдонимы для 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? Или я просто ушел с глубокого конца?
ADDENDUM: В URI одновременно может быть несколько фильтров. Или как разные параметры, либо как список значений для одного параметра. Подумайте о строках «Все классы, реализующие интерфейс X и/или интерфейс Y» или «Все классы, реализующие интерфейс X и находящиеся в пакете ABC» (где пакеты также могут быть адресованы URI, например http://example.org/api/v1/packages/a/b/c
)
Добавлен добавление к этому вопросу. – dafmetal