Изучаем Java EE 7 - [238]

Шрифт
Интервал

100 — ПродолжитьСервер получил заголовки запроса, далее клиент должен прислать тело запроса
101 — Переключение протоколовЗапрашивающая сторона просит сервер переключиться на другой протокол, и сервер соглашается это сделать
200 — ХорошоЗапрос завершен успешно. Тело объекта, если таковое имеется, содержит представление ресурса
201 — СозданЗапрос был выполнен, что привело к созданию нового ресурса
204 — Нет содержимогоСервер успешно обработал запрос, но не возвратил никакого содержимого
206 — Частичное содержимоеСервер доставил лишь часть содержимого; это было обусловлено диапазонами заголовков, заданными клиентом
301 — Перемещено навсегдаЗапрошенному ресурсу был присвоен новый постоянный URI, и при любых последующих ссылках на данный ресурс следует использовать один из возвращенных URI
304 — Не изменялосьУказывает, что ресурс не изменялся с момента последнего запроса
307 — Временное перенаправлениеЗапрос должен быть повторен с другим URI; однако в будущих запросах следует по-прежнему использовать исходный URI
308 — Постоянное перенаправлениеЭтот, а также все последующие запросы должны направляться уже по новому URI
400 — Неверный запросЗапрос не может быть выполнен из-за синтаксической ошибки
401 — Не авторизованПохож на 403, но указывает, что для запроса требовалась аутентификация и она не была выполнена
403 — ЗапрещеноЗапрос был допустимым, но сервер отказался на него отвечать
404 — Не найденоСервер не нашел каких-либо ресурсов, соответствующих URI, содержащемуся в запросе
405 — Метод не поддерживаетсяЗапрос был сделан с использованием метода, который не поддерживается ресурсом
406 — НеприемлемоЗапрошенный ресурс может сгенерировать только такое содержимое, которое является неприемлемым в соответствии с заголовками Accept, указанными в запросе
500 — Внутренняя ошибка сервераСервер столкнулся с неожиданным условием, помешавшим ему выполнить запрос
501 — Не реализованоСервер либо не распознает метод запроса, либо не способен выполнить запрос
503 — Служба недоступнаВ настоящее время сервер недоступен, поскольку он перегружен запросами или остановлен для техобслуживания; как правило, это временное состояние
505 — Версия HTTP не поддерживаетсяСервер не поддерживает ту версию протокола HTTP, которая использовалась в запросе

Кэширование и условные запросы

В большинстве распределенных систем роль кэширования невозможно переоценить. Цель кэширования — оптимизация производительности, достигаемая методом исключения ненужных запросов или снижения объема данных в откликах. Протокол HTTP предоставляет специальные механизмы для реализации кэширования и обеспечения корректности кэшированных данных. Но если клиент решает не использовать механизм кэширования, то все данные ему всякий раз придется запрашивать заново, независимо от того, были ли они изменены с момента последнего запроса.

При отправке ответа на запрос GET отсылаемая информация может содержать заголовок Last-Modified. Он указывает время последнего изменения ресурса. Когда пользовательский агент в следующий раз запросит данный ресурс, он сможет передать эту дату в заголовке If-Modified-Since. Веб-сервер (или прокси-сервер) сравнит эту дату с датой последнего изменения ресурса. Если дата, указанная пользовательским агентом, окажется такой же или более поздней, то будет возвращен код состояния 304 — Не изменялось без тела отклика. В противном случае запрошенная информация будет выполнена или перенаправлена.

Но манипуляции с датами могут быть сложны; в частности, они подразумевают, что все взаимодействующие агенты постоянно остаются синхронизированными. Эта проблема решается с помощью заголовка ответа ETag. ETag фактически является MD5- или SHA1-хешем всех байтов в представлении. Стоит измениться хотя бы одному байту в представлении, как изменится и ETag.

На рис. 15.2 показано, как использовать ETag. Чтобы получить ресурс с информацией о книге, вы используете действие GET, в котором указываете URI ресурса (GET /book/12345). Сервер возвратит ответ с XML-представлением книги, код состояния 200 — Хорошо, а также сгенерированный ETag. Когда вы повторно запросите тот же ресурс, попутно сообщив это же значение ETag в заголовке If-None-Match, сервер не будет отправлять вам представление ресурса, если с момента последнего запроса этот ресурс не изменился. Вместо этого он вернет код состояния 304 — Не изменялось, сообщая клиенту, что с момента последнего обращения ресурс не изменился.


Рис. 15.2. Применение кэширования и кода состояния 304 — Не изменялось


Запросы, использующие HTTP-заголовки If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match и If-Range, называются условными. Условные запросы помогают экономить пространство полосы доступа и ресурсы процессора (как на сервере, так и на клиенте), так как исключают ненужные «круговые» операции передачи данных. Заголовки If-* чаще всего используются с запросами GET и PUT.

От Сети к веб-службам

Все мы пользуемся Сетью и знаем, как она работает. Отчего же веб-службы должны работать иначе? В конце концов, службы также часто обмениваются уникально идентифицируемыми ресурсами, которые связываются с другими ресурсами по принципу, напоминающему расстановку гиперссылок. Масштабируемость веб-архитектуры проверена временем; зачем же заново изобретать велосипед. Так почему бы не использовать при создании, обновлении или удалении ресурса о книге давно знакомые HTTP-операции? Например:


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.