Рекомендации по использованию URI в качестве значения параметра в вызовах REST

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


person dafmetal    schedule 12.05.2010    source источник
comment
Добавил дополнение к вопросу.   -  person dafmetal    schedule 12.05.2010


Ответы (1)


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

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

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

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

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

person Donal Fellows    schedule 12.05.2010
comment
Я добавил дополнение к вопросу. @ S.Lott Не могли бы вы объяснить, почему вы избегаете строк запроса? У меня сложилось впечатление, что это нормально для REST API. - person dafmetal; 12.05.2010
comment
@dafmetal: Насколько я могу судить, интерфейсы RESTful на самом деле не подходят для таких сложных вещей, если они могут с этим помочь. Там, где они не могут, они прибегают к ужасному foo?query=bar делу, которое возвращает список ссылок на ресурсы, удовлетворяющие запросу. - person Donal Fellows; 12.05.2010