2010-05-12 1 views
6

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

+0

Добавлен добавление к этому вопросу. – dafmetal

ответ

3

Я бы для изготовления:

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

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

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

+0

+1: Избегайте строк запроса. –

+0

Я добавил добавление к вопросу. @ S.Lott Не могли бы вы объяснить свои аргументы, избегая строк запроса? У меня создалось впечатление, что это нормально для REST API. – dafmetal

+0

@dafmetal: Насколько я могу судить, интерфейсы RESTful действительно не подходят для таких сложных вещей, если они могут помочь. Там, где они не могут, они идут с ужасным делом 'foo? Query = bar', который возвращает список ссылок на ресурсы, которые удовлетворяют запросу. –