Я разрабатываю API REST, где некоторые ресурсы могут быть параметрами запроса, в которые проникают. В некоторых случаях эти значения фильтра были бы ресурсами от того же API REST. Это делает для длинноватого и довольно нечитабельного URIs. В то время как это не слишком много проблемы сам по себе, потому что URIs предназначены, чтобы создаваться и управляться программно, оно делает для некоторой болезненной отладки. Я думал о разрешении ярлыков на URIs, используемый в качестве фильтра, оценивает и интересно, позволяется ли это согласно остальным архитектуру и если существуют любые лучшие практики.
Например:
У меня есть ресурс, который получает меня классы 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
Другой способ позволить короче 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? Или я просто действовал сгоряча?
ПРИЛОЖЕНИЕ: мог бы быть больше чем один фильтр в URI сразу. Или как различные параметры, или как список значений для единственного параметра. Думайте вроде "Всех классов, что Интерфейс реализации X и/или Интерфейс Y" или "Все классы, которые реализуют Интерфейс X и находятся в пакете A.B.C" (где пакеты также были бы адресуемы к URI как http://example.org/api/v1/packages/a/b/c
)
Я бы сделал:
GET http://example.org/api/v1/class/java.util.Collection/subclasses
вернуть список ссылок на другие записи в вашем RESTful API, по одной для каждого прямого подкласса. Я бы также сделал эту информацию доступной как часть дескриптора, возвращаемого:
GET http://example.org/api/v1/class/java.util.Collection
(это также будет включать ссылку на предыдущий конкретный запрос.)