Во-первых, я просто расширяю то, что Дафф ответил выше. Я расширяю ответ Даффа с момента моего изучения или разработки и реализации RESTful WebServices, и, пожалуйста, обратите внимание, что я все еще учусь.
Когда я начал изучать RESTful WS с Java, Джерси (0.3 IIRC), у меня возникли аналогичные вопросы, и основной причиной этого было неправильное представление об общей архитектуре RESTful. Самой «серьезной» ошибкой, которую я совершил, было использование JAXB для XML и Джексона для JSON (де) сериализации непосредственно из / в bean-компоненты персистентности. Это полностью нарушает принцип REST и, следовательно, создает некоторые жизненно важные проблемы при создании высокопроизводительного, высокодоступного, масштабируемого веб-сервиса.
Моя ошибка заключалась в том, что, думая в терминах API a.k.a Service, когда мы думаем о RESTful WS, мы должны забыть «API» и думать: Ресурсы . Мы должны очень внимательно относиться к взаимосвязанным ресурсам. Мое понимание этого пришло только после прочтения this , я предлагаю его всем, кто хочет создать собственный веб-сервис. Мой вывод заключается в том, что Resource для RESTful WS / Architecture представляет собой API для нативного интерфейса или веб-службы SOAP. Поэтому я бы предложил тщательно спроектировать ваши ресурсы и понять, что ресурсы вашего WebService могут быть неограниченными.
Итак, вот как я пришел к выводу о реализации систем, предоставляющих «API» через RESTful WS. Я создаю API, который взаимодействует с бизнес-объектами, например, PersistentBook, который содержит либо идентификатор PersistentAuthor, либо сам объект. Вся бизнес-логика с учетом постоянных сущностей лежит на уровне реализации API.
Уровень веб-службы использует уровень API для выполнения своих операций над ресурсами. Уровень веб-службы использует постоянные сущности для генерации представлений bean-компонентов и наоборот, ключевой особенностью здесь будет представление PersistentBook, которое будет иметь URI для PersistentAuthor. Если я хочу использовать автоматическую (де) сериализацию, я создаю другой слой домена, например, Книга, Автор и т. Д.
Теперь, когда Дафф упоминал, что кэширование было бы неизбежным, мои контрольные точки для них -
- Поддержка заголовков ответов «Cache-Control», «Last-Modified», «ETag» и заголовков запросов «If-Modified-Since», «If-Match-None». Обратите внимание на мои недавние знания - используйте заголовок 'Vary' в случае различных представлений (согласование контента) на основе заголовка "Accept".
- Использование кэширования на стороне сервера, такого как Squid, Varnish, если клиенты не используют кэширование. Одна вещь, которую я узнал, наличие правильной поддержки заголовков ничего не значит, если клиенты их поддерживают, и фактически увеличивает стоимость с точки зрения вычислений и плохой пропускной способности;)
- Использование Content-Encoding.