Как справиться с разрешением на глагол в Rest на клиенте?

Давайте предположим, что у нас есть ресурс по URL-адресу, например: foo.com/api/bar И допустим, что пользователю может быть разрешено ПОЛУЧИТЬ этот ресурс, но ему не разрешено отправлять POST на этот ресурс.

Я могу легко решить эту проблему, указав разные разрешения для каждого глагола. Но как клиент должен заранее узнать, разрешено ли ему выполнять POST?

Допустим, у нас есть кнопка «Сохранить» на странице, которую не следует активировать, если у пользователя нет прав на выполнение POST.

Я знаю об ограничении HATEOAS/Hypermedia и могу передать список ссылок для различных действий вместе с ресурсом. Но, насколько мне известно, это не содержит информации о том, какие глаголы использовать, а только URL-адреса для различных действий. Существуют ли другие варианты, в которые включен глагол?

Есть ли другие подходы, если вы не хотите загромождать ресурс всякими метаданными?


person Roger Johansson    schedule 23.01.2015    source источник


Ответы (2)


Об этом много раз спрашивали на дискуссионных форумах HAL https://groups.google.com/forum/#!forum/hal-discuss

Тот факт, что глаголы не возвращаются, является решением используемого вами формата гипермедиа, который, как я предполагаю, является HAL (или, может быть, коллекция + json). Некоторые форматы ДЕЙСТВИТЕЛЬНО включают информацию о глаголах.

HAL на самом деле позволяет вам включать настраиваемые поля в ваши объекты ссылок, если вы хотите, но я бы не рекомендовал это, потому что любой стандартный клиент не будет знать, как это интерпретировать.

Но также я обнаружил, что глагол в конце концов бесполезен.

Прежде всего, в человеко-машине 2 пользователь будет читать документацию. HAL имеет разыменование всех своих ссылок (через CURIE, поскольку они в настоящее время называются naemd) на удобочитаемую документацию, которая должна описывать эффекты запроса этой ссылки с различными параметрами, глаголами, заголовками и т. д.

Далее, чтобы ваше приложение было действительно RESTful, вы должны реагировать на все глаголы... вы можете просто не отвечать, что глагол был в порядке. Для приложения на основе HTTP, возвращающего 405, ОЧЕНЬ подходит. Возврат 404 невозможен! 500 было бы хуже!. Ваш 405 должен включать, какие методы доступны для запрошенного ресурса.

Затем, в случае машины 2 (и немного h2m), ваше приложение при доступе через HTTP (я стараюсь избегать http в своих ответах, поскольку приложения RESTful не обязательно являются HTTP ... хотя я бы сказал, что 101% из них ) следует использовать метод OPTIONS (http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html) по URL-адресу ресурса, чтобы получить описание возможных вариантов.

Вот где я вижу, как многие люди сбиваются с толку, каким должен быть ответ OPTIONS? ну, что люди забывают, так это согласование типа контента! Заявитель должен указать, какой формат информации об опциях он ожидает. Примите: какой-то машинный язык/xml или приложение/язык+json. Некоторые RFC или стандарты определяют эти типы контента, и ваш API может определить, какие форматы он поддерживает. Я бы посоветовал вам включить поддержку text/html, чтобы вы также могли возвращать удобочитаемую документацию о том, какие глаголы поддерживаются. Это хорошо покрывает сценарий h2m.

Такое же согласование типа содержимого может быть полезно при возврате информации о неподдерживаемом методе. Сервер может отправить тип контента, понятный клиенту, который семантически описывает, какие методы разрешены.

Последнее, на что я хотел бы обратить внимание, это то, что методы подразумевают намерение клиента. я хочу ПОСТАВИТЬ этот ресурс или УДАЛИТЬ этот ресурс. Сервер должен принимать запросы и возвращать ответы, указывающие, какие переходы состояний произошли из-за этого запроса. Таким образом, немного глупо заставлять API определять возможные намерения клиента при каждом запросе. Клиент знает, что он хочет сделать, он должен попытаться, а если не сможет, то должен с этим справиться.

person Chris DaMour    schedule 23.01.2015

Глаголы HTTP — это чистые глаголы транспортного протокола. Это могут быть неправильные глаголы для выполнения функций приложения именно из-за проблем, которые вы упомянули в вопросе. Итак, давайте посмотрим, можем ли мы подойти к этому по-другому, не используя HTTP-глаголы. Выполнение глаголов http для выполнения действий приложения может ограничить нас завтра, поскольку нам может понадобиться перейти с http на другой протокол.

Возьмем пример для иллюстрации. Допустим, мы говорим о приложении Update Delete с использованием HATEOAS. Итак, в этом случае, если есть два продукта, представленные URL-адресами www.abc.com/product/001 и www.abc.com/product/002. В истинной ситуации HATEOAS, если необходимо просмотреть ответ двух продуктов product/001 и product/002, отобразите экраны клиента.

Таким образом, если ответ на product/001 имеет ответ product/001/delete, product/001/change и product/002 имеет ответ product/002/Change, тогда клиент покажет удаление только для product/001 и изменение для другого два продукта.

Итак, в ответ на ваш вопрос. Правильно определяя действия с продуктом, теперь можно выполнять действия на основе ролей.

Надеюсь, я ответил на ваш вопрос.

person Antony gonzalves    schedule 04.03.2015