Генерация ссылок Hypermedia в веб-API

Мне любопытно узнать, как другие справились с проблемой создания гипермедиа-ссылок для своих веб-API? В частности, я использую веб-API ASP.NET и разрываюсь между операциями, возвращающими типы, связанные с гипермедиа, или возвратом самого ресурса, и тем, чтобы гипермедиа происходили позже в конвейере. То есть склонны ли люди делать такие вещи, как:

public Resource<Order> GetOrder(int id) { 
  return new Resource<Order>() {
      Content = new Order(),
      Links = new LinkCollection<Order>() { new AddOrderLink(), new UpdateOrderLink()}
  }

Или что-то более похожее

public Order GetOrder(int id) { return new Order(); }

А затем добавить гипермедиа-ссылки внутри HttpOperationHandler или пользовательского средства форматирования или чего-то еще?

Если подход больше похож на № 2, как узнать, какие ссылки генерировать? Просто есть какой-то стандартный набор ссылок, которые генерируются для всех объектов Order? Атрибуты, украшающие различные операции в OrdersController?


person Jordan0Day    schedule 05.09.2012    source источник
comment
Приложение: я прочитал сообщение Гленна Блока о гипермедиа в веб-API (codebetter.com/glennblock/2012/01/08/), и хотя он, похоже, предпочитает генерировать ссылки в процессе работы (аналогично примеру 1 выше), Я чувствую, что путь промежуточного программного обеспечения, который он упоминает ближе к концу, кажется более естественным.   -  person Jordan0Day    schedule 06.09.2012
comment
посмотрите презентацию от ammy в teched newzealand channel9.msdn.com/Events/TechEd /NewZealand/2013/DEV305 ее решение многообещающе для гипермедиа с веб-API. Также посмотрите пример кода на github.   -  person Gomes    schedule 02.10.2013


Ответы (4)


Я предпочитаю второй вариант (добавление гипермедиа-ссылок позже) и записал об этом вчера.

Решение состояло в том, чтобы «обогатить» мои ресурсы гипермедиа-ссылками, прежде чем они будут возвращены клиенту с помощью обработчика сообщений.

person Ben Foster    schedule 06.09.2012
comment
Это действительно круто, спасибо, что поделились. Мы использовали методы расширения, и это был скорее шаблонный код, который составлял 1 строку кода в методе действия. Мне нравится, что у вас есть возвращаемый ресурс и вы можете добавлять или не добавлять гипермедиа в зависимости от контекста. - person suing; 27.09.2012

Вы можете использовать Hyprlinkr из github.

Я планирую использовать его в своем следующем проекте, так как это кажется приятным и простым, и вы можете получить его через пакет nuget.

person Diego Garcia    schedule 06.09.2012
comment
Таким образом, Hyprlinkr является хорошим решением для фактического создания ссылок, когда вы знаете, какие ссылки вы хотите создать. Мой вопрос был больше о том, как узнать, какие ссылки мне нужно генерировать, а не о том, как мне их генерировать? В любом случае, Hyperlinkr помогает решить проблему, как только вы доберетесь до части «как». - person Jordan0Day; 06.09.2012

Отвечая на этот вопрос, полезно взглянуть на подход ASP.NET MVC к решению этой проблемы, поскольку ASP.NET MVC может рассматриваться как версия Web API с ограничениями на текст/html (ручное согласование содержимого несмотря на это), и поскольку это, очевидно, сильно повлияло на дизайн веб-API.

По сути, мы можем использовать настраиваемые средства форматирования для изменения представлений на основе маршрута или атрибута действия. Об этом сообщает способ, которым ASP.NET MVC отделяет представления от моделей. В проекте ASP.NET MVC одна модель может отображаться с помощью различных шаблонов представлений. Каждый из этих шаблонов представлений, по сути, «жестко кодирует» переходные ссылки (элементы привязки, формы и ссылки) в это конкретное представление модели. Выбор шаблона представления определяется преимущественно соглашением (контроллер и имя действия), но также может быть жестко запрограммирован в действии.

Механизм представления и соглашение о поиске представлений в ASP.NET MVC можно рассматривать как настраиваемый модуль форматирования веб-API. Это может быть обобщено таким образом, что для каждого поддерживаемого типа мультимедиа пользовательский модуль форматирования использует сведения о маршруте и, необязательно, атрибут, применяемый к вызываемому методу действия, для определения состояния ресурса. (Согласно этому соглашению, полезно выбирать имена действий, отражающие состояние ресурса.) Как только модуль форматирования узнает состояние ресурса, он может делегировать код форматирования для конкретного состояния. В этом коде будут определены ссылки для конкретных состояний.

Этот код форматирования для конкретного состояния также может делегироваться другим подпрограммам форматирования, почти так же, как представления Razor поддерживают композицию частичных представлений.

person G-Wiz    schedule 21.02.2013

Я добавил свое решение здесь

Он использует атрибуты класса и свойства в сочетании с методом расширения ApiController для заполнения объекта ResourceLink в вашей сущности. Он также может заполнять ссылки для любых свойств коллекции. Это не законченная статья, но она вполне интуитивно понятна и станет хорошим началом.

person DavidWainwright    schedule 08.09.2017