Рекомендации по использованию URI в качестве значения параметра в вызовах REST - PullRequest
6 голосов
/ 12 мая 2010

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

1 Ответ

3 голосов
/ 12 мая 2010

Я бы пошел на изготовление:

GET http://example.org/api/v1/class/java.util.Collection/subclasses

возвращает список ссылок на другие записи в вашем RESTful API, по одной для каждого прямого подкласса. Я бы также сделал эту информацию доступной как часть дескриптора, возвращаемого:

GET http://example.org/api/v1/class/java.util.Collection

(Это также будет включать ссылку на предыдущий конкретный запрос.)

...