Программирование HTTP с использованием WCF - Основы сообщений HTTP

ОГЛАВЛЕНИЕ

Основы сообщений HTTP

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

HTTP является транспортным средством глобальной сети. Протоколу HTTP требуется шаблон обмена сообщениями (MEP) для запроса и отклика. Каждый раз при использовании обозревателя для перехода на веб-страницу происходит следующее: запрашивается ресурс и возвращается один отклик, содержащий этот ресурс. Транспорт HTTP определяет несколько глаголов (называемых также методами), надстраивающих функции на шаблоне запроса или отклика MEP, например GET, POST, PUT и DELETE. Чтобы проиллюстрировать некоторые различия между глаголами HTTP, рассмотрим подробнее глагол POST протокола HTTP. Приведем укороченную версию:

POST /myservice/PostAlbum HTTP 1.1
HOST: www.cloudsample.net
<albumInfo>
  <albumId>15</albumId>
</albumInfo>

По существу, это просто сообщение, отправляемое ожидающему вызова приложению. В данном случае сообщение отправляется по адресу http://www.cloudsamples.net/myservice/PostAlbum. В этом сообщении содержатся также полезные данные, в которые входит значение для поля albumId. Выделяя основное, можно сказать, что глагол POST протокола HTTP представляет собой способ передавать полезные данные приложению, ожидающему вызова.

В данном примере полезные данные настолько просты, что они целиком могли бы быть представлены числом 15. Чтобы эта схема работала, принимающее приложение должно знать, что число 15 соответствует значению поля albumId. Эта возможность наряду с другими является одной из основных, предлагаемых глаголом GET протокола HTTP. Например, преобразуя предыдущий HTTP POST в HTTP GET, мы получаем следующее:

GET /myservice/GetAlbum/15 HTTP 1.1
HOST: www.cloudsamples.net

HTTP GET является оптимизированным HTTP POST и позволяет избавиться от необходимости использования полезной нагрузки. По существу, полезной нагрузкой является URI-адрес. Результатом этого является уменьшение размеров сообщений, что, в свою очередь, приводит к сокращению времени передачи. Уменьшение размеров сообщения и надежность URI-адреса обеспечивают еще одно положительное следствие: другим приложениям (прокси или обозревателям) проще кэшировать результаты предыдущих сообщений HTTP GET для одного и того же ресурса. Важно отметить, что HTTP GET используется чаще, чем любой другой глагол HTTP.

По своей сути, HTTP GET является запросом некоторого ресурса. Чтобы проиллюстрировать это, представим, что вы ищете интересующий вас ресурс в Интернете (скажем, http://www.cloudsamples.net/pictureservices) и собираетесь сообщить о нем другу по электронной почте. Когда ваш друг получает сообщение электронной почты, предполагается, что он, щелкнув ссылку, увидит ту же страницу, которую просматривали вы. Понятно, что вы будете удивлены, если ресурс по адресу http://www.cloudsamples.net/pictureservices внезапно окажется страницей с последними новостями от MSNBC. На самом деле URI-адрес, используемый в HTTP GET, действительно является представлением ресурса, и вы, как правило, не предполагаете, что ресурс изменится.

В то время как имеется полное согласие относительно того, что представляет HTTP GET, это не так для других глаголов HTTP. Представим реализацию отправки сообщения HTTP DELETE принимающему приложению. Должно ли принимающее приложение изменить свое состояние или выполнить то же действие? Обычно глагол HTTP DELETE связан с субтрактивным изменением состояния или действием, но особенности этого изменения состояния не определяются. То же самое верно и для HTTP PUT. Глагол HTTP PUT, как правило, связан с некоторым типом аддитивного изменения состояния или действием, но точная форма этого изменения меняется от приложения к приложению.