2013-08-26 3 views
2

Похоже, что большинство примеров WebAPI возвращают некоторые модели (либо модели домена, либо модели определенного вида).Как создать частичные элементы API RESTful в C#?

При использовании моделей доменов мы фактически запрашиваем больше данных, чем необходимо в представлении от вызовов ajax, а затем создаем наши модели просмотра с использованием JavaScript (при условии, что мы создаем веб-приложение).

Я попытался использовать разные модели просмотра для каждой страницы (вида), которые позволяют мне уменьшить площадь сети и возвращать только нужные поля. Но в ApiController у меня было бы слишком много методов GET. И мы не можем предсказать будущую потребность и построить API, возвращающий все виды моделей представлений.

Я хотел бы, чтобы имитировать API Facebook Graph и построить URI, как:

http://... api/games/333?fields=id, name, price, imageUrl 

И наш пользователь должен иметь возможность обновить запись только эти несколько полей.

Подробное описание можно найти в записи блога в коде Google: Making APIs Faster: Introducing Partial Response and Partial Update.

Some other posts here предположим, что это превышает текущую способность ASP.NET WebAPI. Будет ли ServiceStack или какой-либо другой пакет помочь нам достичь цели?

ответ

1

Вы можете использовать OData Protocol, посмотрите this example. Он может использовать ключ: $ select, $ expand, $ filter for search, select some fileds. . Самое главное, ASP.NET WEB API имеет SDK для поддержки этого.

+0

Спасибо! Это решение выглядит ближе всего к тому, что нам нужно. Вероятно, именно поэтому WebAPI не будет включать функцию PartialResponse. Я попытался найти SDK WebAPI, который вы упомянули, но не смог найти. Не могли бы вы разместить ссылку для нас? Но я нашел кучу примеров, которые я могу изучить. [http://bit.ly/19WIUuE] Спасибо, что указали мне на совершенно новое направление. – Blaise

+0

Рад помочь вам. SDK вы можете получить его на Nuget, найти 'oData'. Это [учебники] (http://www.asp.net/web-api/overview/odata-support-in-aspnet -web-api) для OData и их [исходного кода] (https://aspnetwebstack.codeplex.com/) в кодексе. Я разрабатываю OData для использования сайта, [источник] (https://github.com/TossShinHwa/CMS) в github. –

2

Попробуйте этот проект: https://github.com/AnthonyCarl/ServiceStack.PartialResponse для частичного ответа стороны вопроса

ServiceStack.PartialResponse.ServiceModel

Стиль

Google Частичные Отклики для ServiceStack.Net. В настоящее время только следующего содержания типы:

  • приложения/JSON
  • применение/JSV
  • текст/html
  • приложение/XML не поддерживается.

Я хотел бы реализовать это как ServiceStack IPlugin, но я не смог , чтобы выяснить, как получить доступ мне нужно в ответ DTO для моего подхода. В настоящее время это реализовано как расширение IRequestContext .

Обеспечение полевых селекторов

Полевые селекторы могут быть переданы с помощью строки заголовка или запроса. По умолчанию селектора полей по умолчанию объединены. Дублируемое поле селекторов уменьшено. Селектор полей применяется ко всем записям в списке , если селектор ссылается на список.

+0

Спасибо за ответ. Но является ли этот проект «PartialResponse» зрелым продуктом? В настоящий момент есть только 1 вкладчик и 51 коммит. Есть ли учебник или образец кода сейчас? – Blaise

+0

Это не мой проект, поэтому я не могу дать вам окончательного ответа. Я предлагаю зарегистрировать проблему на github с вашими вопросами. –

2

Существует несколько вариантов реализации частичных обновлений в ServiceStack. См. this question about implementing PATCH requests для подхода, который использует запрос DTO с нулевыми значениями и PopulateWithNonDefaultValues и аналогичные методы расширения в ServiceStack, чтобы выполнить запрос типа PATCH, где клиент может отправить любое подмножество полей в теле запроса. Если заданное поле отсутствует в элементе запроса, то это свойство объекта домена не будет обновляться.

Если вам действительно нужно использовать строку запроса, чтобы указать подмножество полей, которые необходимо обновить, то вы все равно можете использовать описанный выше подход, но добавьте код, который сначала отменяет любые значения во входящем запросе объекта DTO которые не указаны в строке запроса. Затем вы можете снова использовать PopulateWithNonDefaultValues, чтобы скопировать остальные значения в объект домена.

Кроме того, чтобы прокомментировать другую часть вашего поста, что тесно связано с рекомендациями, я просто дал:

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

Здесь полезно использовать конструкцию, основанную на сообщениях: моделируйте ваши сообщения запроса/ответа как отдельные классы DTO, вместо повторного использования и отображения объектов вашей внутренней модели домена. Помимо преимуществ, вы устраните проблему выявления ненужных полей в моделях вашего запроса/ответа. Дизайн на основе сообщений - одна из основных концепций, которые приводят к внедрению ServiceStack. Тем не менее, вы можете добиться аналогичных результатов с помощью Web API или MVC. Я настоятельно рекомендую прочитать this article, где обсуждается, как этот проект работает в ServiceStack.

Смежные вопросы