- узел SOAP, инстанцированный в сервере HTTP, может иметь роль (т.е. свойство http://www.w3.org/2002/12/soap/bindingFramework/ExchangeContext/Role) "RespondingSOAPNode".
В следующих пунктах данного подраздела описывается конечный автомат ШОС и его отношение к протоколу HTTP. В таблицах переходов, представленных ниже, состояния определены как значения свойства http://www.w3.org/2003/05/soap/bindingFramework/ExchangeContext/State (см. 8.2 и 8.3) и имеют тип xs:anyURI. Для краткости используются относительные URI, а базовый URI представляет собой http://www.w3.org/2003/05/soap/bindingFramework/ExchangeContext/Role.
Используемый шаблон обмена сообщениями обозначается в методе HTTP запроса. HTTP GET соответствует ШОС "ответ SOAP", HTTP POST соответствует ШОС "запрос-ответ".
9.5.1 Поведение запрашивающего узла SOAP
В целом, поведение запрашивающего узла SOAP подчиняется описанию конечного автомата, соответствующего шаблону "запрос-ответ" (см. 8.2) или шаблону "ответ SOAP" (см. 8.3) (различия обозначены по мере необходимости). Данная привязка поддерживает потоковую передачу, поэтому запрашивающие узлы SOAP ДОЛЖНЫ избегать взаимной блокировки, принимая, и при необходимости, обрабатывая информацию ответа SOAP во время передачи запроса SOAP (см. 8.2.3). Следующие подпункты подробно описывают каждое состояние.
9.5.1.1 Init (Инициализация)
В состоянии "Init" формируется запрос HTTP (согласно таблице 16) и инициируется передача запроса.
Таблица 16 - Поля запроса HTTP
Поле | Значение |
Метод HTTP | Согласно свойству http://www.w3.org/2003/05/soap/features/web-method/Method. POST и GET - единственные значения, поддерживаемые данной привязкой |
URI запроса | Значение URI, содержащееся в свойстве http://www.w3.org/2003/05/soap/mep/lmmediateDestination контекста обмена сообщениями |
Поле заголовка Content-Type | Если в заголовке присутствует поле Content-Type, то оно содержит тип медиа объекта запроса; в противном случае, поле заголовка опускается (см. 9.1 для описания допустимых типов медиа). Если инфо-набор конверта SOAP в свойстве http://www.w3.org/2003/05/soap/mep/OutboundMessage равен null, то поле заголовка Content-Type МОЖЕТ быть опущено |
Параметр Action | В соответствии со значением свойства http://www.w3.org/2003/05/soap/features/action/Action |
Поле заголовка Accept (опционально) | Список типов медиа, которые принимаются в ответе на сообщение запроса |
Дополнительные поля заголовка | Генерируется в соответствии с правилами для выражения, определенного привязкой, или любых дополнительных функций при использовании в обмене сообщениями данного сообщения. Например, поле заголовка Content-Encoding (см. HTTP [RFC 2616], подраздел 14.11) может использоваться для того, чтобы указать, что используется опциональная функция сжатия |
Тело объекта HTTP | Сообщение SOAP, сериализированное в тип типа медиа, равного значению поля заголовка Content-Type согласно правилам передачи сообщений SOAP. Правила для формирования сообщения SOAP для типа медиа "application/soap+xml" представлены в приложении A. Если инфо-набор конверта SOAP в свойстве http://www. w3.org/2003/05/soap/mep/OutboundMessage равен null, тело объекта опускается |
9.5.1.2 Requesting (Запрос)
В состоянии "Requesting" продолжается отправка запроса одновременно с ожиданием начала сообщения ответа. В таблице 17 описаны переходы, происходящие, когда запрашивающий узел SOAP получает строку состояния и поля заголовка ответа HTTP. Для некоторых кодов состояния следующее состояние неоднозначно. В случаях, где состояние "Отказ" является одним из вариантов следующего состояния, переход зависит от того, присутствует ли сообщение SOAP в ответе HTTP. Если сообщение SOAP присутствует, следующее состояние - "Sending + Receiving" или "Receiving", в противном случае следующее состояние - "Fail". Выбор состояния между "Sending+Receiving" и "Receiving" зависит от используемого шаблона обмена сообщениями: "Sending + Receiving" - следующее состояние для шаблона "запрос-ответ", в то время как "Receiving" - следующее состояние для шаблона "ответ SOAP".
Таблица 17 - Переходы, зависимые от статус-кода HTTP
Код состоя- ния | Поясня- ющая фраза | Значение/Действие | Следующее состояние |
2хх | Successful | ||
200 | OK | Сообщение ответа передается в теле объекта ответа HTTP. Начать конструирование абстрактного сообщения ответа в http://www.w3.org/2003/05/soap/mep/InboundMessage | "Sending + Receiving" или "Receiving" |
202 | OK | Запрос был принят, но или (а) никакой конверт ответа не получен, или (b) получен конверт, представляющий информацию, связанную с запросом - такие конверты СЛЕДУЕТ обрабатывать, используя модель обработки SOAP ([ИСО/МЭК 40210, раздел 5]) | "Receiving" (после которого сразу произойдет переход в состояние "Success") |
301, 302, 307 | Redirect | Запрашиваемый ресурс был перемещен. В случае небезопасного метода HTTP, такого как POST или PUT, для продолжения операции требуется явное подтверждение. В случае безопасного метода, такого как GET, или если перенаправление было подтверждено, СЛЕДУЕТ повторить HTTP запрос, поместив в свойство http://www.w3.org/2003/05/soap/mep/lmmediateDestination значение URI из соответствующего поля заголовка Location | "Init" или "Fail" |
303 | See Other | Запрашиваемый ресурс был перемещен. СЛЕДУЕТ повторить HTTP запрос, поместив в свойство http://www.w3.org/ 2003/05/soap/mep/lmmediateDestination значение URI из связанного поля заголовка Location. Значение http://www.w3.org/2003/05/soap/features/web-method/Method изменено на "GET", значение http://www.w3.org/2003/05/soap/mep/OutboundMessage установлено в "null"* | "Init" |
4хх | Client Error | ||
400 | Bad Request | Указывает на проблему, связанную с полученным сообщением запроса HTTP | "Sending + Receiving", "Receiving" или "Fail" |
401 | Unauthorized | Указывает, что запрос HTTP требует авторизации. Обмен сообщениями расценивается как завершавшийся неудачно | "Requesting" или "Fail" |
405 | Method not allowed | Указывает, что сервер HTTP не поддерживает требуемый HTTP метод в данном URI запроса. Обмен сообщениями расценивается как завершавшийся неудачно | "Fail" |
415 | Unsupported Media Type | Указывает, что сервер HTTP не поддерживает Content-type, использованный при кодировании сообщения запроса. Обмен сообщениями расценивается как завершавшийся неудачно | "Fail" |
5хх | Server Error | ||
500 | Internal Server Error | Указывает на проблему сервера или проблему с полученным запросом | "Sending + Receiving", "Receiving" или "Fail" |
* Код состояния 303 ДОЛЖЕН быть отправлен только если конверт SOAP запроса обработан согласно модели обработки SOAP и ответ SOAP доступен по URI, присланного вместе с кодом статуса 303. |
Таблица 17 ссылается на некоторые, но не на все существующие коды состояния HTTP/1.1 [RFC 2616]. В дополнение к этим кодам состояния HTTP обеспечивает открытый механизм для поддержки кодов состояния, определенных расширениями HTTP (см. [RFC 2817], где описан механизм регистрации новых кодов состояния). Коды состояния HTTP разделены на классы кодов состояния в соответствии со спецификацией HTTP [RFC 2616, пункт 6.1.1]. Привязка SOAP к HTTP следует правилам для приложений HTTP: реализация привязки SOAP к HTTP должна понимать класс любого кода состояния, обозначенного первой цифрой, и обрабатывать любой нераспознанный ответ, как являющийся эквивалентным ответу с кодом состояния х00-го класса, с одним исключением - нераспознанный ответ не должен кэшироваться.
Примечание - В инфраструктуре HTTP могут присутствовать элементы, сконфигурированные для изменения сообщения ответа HTTP для кодов состояния 4хх и 5хх. Например, некоторые исходные HTTP сервера имеют такую опцию в качестве конфигурационного параметра. Это поведение может конфликтовать с поведением, использующим ответные коды состояния 4хх и 5хх, передающие сообщения отказа SOAP в HTTP, и рекомендуется, чтобы такое поведение было отключено для ресурсов, принимающих запросы SOAP/HTTP. Если поведение, изменяющее сообщения ответов для кодов состояния 4хх и 5хх не может быть отключено, то SOAP/HTTP не может использоваться в таких конфигурациях.
9.5.1.3 Sending+Receiving (Отправка и получение)
В состоянии "Sending+Receiving" (только ШОС "запрос-ответ", см. 8.2) передача сообщения запроса и получение сообщения ответа завершены. Только в случае, если получен код состояния 200, предполагается, что полученный ответ содержит конверт SOAP, сериализированный в тип медиа, указанный в поле заголовка Content-type, согласно правилам передачи сообщения SOAP.
Ответ МОЖЕТ иметь тип Content-Type не только "application/soap+xml". Такое использование считается ненормативным, и, соответственно, оно не моделируется в конечном автомате. Интерпретация таких ответов остается на усмотрение получателя. Точно так же получение любого тела объекта ответа с кодом состояния 202 ненормативно. Если такой неожиданный ответ имеет тип "application/soap+xml", то обработка SOAP такого ответа выходит за рамки данной спецификации привязки.
9.5.1.4 Receiving (Получение)
В состоянии "Receiving" (только ШОС "ответ SOAP", см. 8.3) получение сообщения ответа завершается. Только в случае кода состояния 200 предполагается, что сообщение ответа содержит конверт SOAP, сериализированный в тип медиа, указанный в поле заголовка Content-Type, согласно правилам передачи сообщения SOAP.
Ответ МОЖЕТ иметь тип контента (Content-Type), отличный от "application/soap+xml". Такой результат особенно вероятен, если запрос SOAP, отправленный с помощью метода "GET" со свойством http://www.w3.org/2003/05/soap/features/web-method/Method, направлен (преднамеренно или иным образом) к серверу HTTP, не являющемуся в том числе и сервером SOAP. Такое использование считается ненормативным и, соответственно, не моделируется в конечном автомате. Интерпретация таких ответов остается на усмотрение получателя. Точно так же получение любого объекта-тела ответа с кодом состояния 202 ненормативно. Если такой неожиданный ответ имеет тип "application/soap+xml", то обработка SOAP такого ответа выходит за рамки спецификации данной привязки.
9.5.1.5 Success (Успех) и Fail (Отказ)
"Success" и "Fail" - терминальные состояния шаблонов "запрос-ответ" и "ответ SOAP". Управление контекстом обмена сообщениями возвращается к локальному узлу SOAP.
Если состояние "Success" было достигнуто, и конверт SOAP был получен, то локальный узел является получателем SOAP (см. [ИСО/МЭК 40210, пункт 4.4.3]) и ДОЛЖЕН выполнять требования раздела "Узлы SOAP" [ИСО/МЭК 40210, подраздел 5.1] для обработки сообщения согласно модели обработки SOAP [ИСО/МЭК 40210, раздел 5].
9.5.2 Поведение отвечающего узла SOAP
В целом, поведение отвечающего узла SOAP следует описанию конечного автомата, соответствующего шаблону "запрос-ответ" (см. 8.2) или шаблону "ответ SOAP" (см. 8.3) (различия обозначены по мере необходимости). Следующие подпункты подробно описывают каждое состояние.
9.5.2.1 Init (Инициализация)
В состоянии "Init" привязка ожидает поступление входящего сообщения запроса. В таблице 18 представлены ошибки, которые может генерировать отвечающий узел SOAP, находящийся в состоянии "Init". В этом состоянии никакие сообщения SOAP не принимаются, поэтому узел SOAP не может генерировать отказ SOAP.
Таблица 18 - Ошибки, возможные в состоянии Инициализация
Проблема с сообщением | Код состояния HTTP | Поясняющая фраза HTTP (информативная) |
Плохо сформированное сообщение запроса | 400 | Bad request |
Некорректный HTTP метод: не POST и не GET | 405 | Method not allowed |
Неподдерживаемый метод инкапсуляции сообщения | 415 | Unsupported media |
9.5.2.2 Receiving (Получение)
В состоянии "Receiving" привязка получает запрос и любое связанное с ним сообщение и ожидает готовности сообщения ответа. В таблице 19 представлены поля заголовка ответа HTTP, сгенерированные отвечающим узлом SOAP. В таблице 20 представлены коды состояния HTTP, связанные с отказами SOAP, которые могут быть сгенерированы отвечающим узлом SOAP.
Таблица 19 - Поля заголовков ответа HTTP
Поле | Значение |
Строка состояния | Если конверт ответа SOAP доступен в http://www.w3.org/2003/05/soap/mep/OutboundMessage, то устанавливается значение 200 или, если был сгенерирован отказ SOAP, значение устанавливается согласно таблице 20. В противном случае, если никакой конверт SOAP не предоставлен, то устанавливается значение 202 |
Поле заголовка Content-Type | Если код состояния 200, то устанавливается значение типа медиа тела ответа, см. описание допустимых типов медиа в 9.1. Если код состояния не 200, то заголовок Content-Type не отправляется |
Дополнительные поля заголовка | Генерируются в соответствии с установленным привязкой выражением для любых дополнительных функций, использованных в данном обмене сообщениями. Например, поле заголовка Content-Encoding (см. HTTP [RFC 2616], подраздел 14.11) может использоваться для того, чтобы указать, что используется опциональная функции сжатия |
Тело объекта HTTP | Только в случае кода состояния 200 сообщение SOAP сериализируется в тип медиа, заданном в поле заголовка Content-Type, согласно правилам для отправки сообщений SOAP. Правила для передачи сообщения SOAP в типе медиа "application/ soap+xml" приведены в приложении A |
Таблица 20 - Отображение отказов SOAP в коды состояния HTTP
Отказ SOAP | Код состояния HTTP | Поясняющая фраза HTTP (информативная) |
env:VersionMismatch | 500 | Internal server error |
еnv:МustUndеrstand | 500 | Internal server error |
env:Sender | 400 | Bad request |
env:Receiver | 500 | Internal server error |
env:DataEncodingUnknown | 500 | Internal server error |
9.5.2.3 Receiving+Sending (Получение и отправка)
В состоянии "Receiving+Sending" (только ШОС "запрос-ответ", см. 8.2) привязка завершает получение сообщения запроса и передачу сообщения ответа.
9.5.2.4 Отправка
В состоянии "Отправка" (см. только 8.3) привязка завершает передачу сообщения ответа.
9.5.2.5 Success (Успех) и Fail (Отказ)
"Success" и "Fail" - терминальные состояния для шаблонов "запрос-ответ" и "ответ SOAP". С точки зрения локального узла данный обмен сообщениями завершен.
9.6 Соображения безопасности
Привязка SOAP к HTTP (см. раздел 9) может рассматриваться как расширение прикладного протокола HTTP. Поэтому все соображения безопасности, идентифицированные и описанные в спецификации HTTP [RFC 2616, раздел 15], применимы к привязке SOAP к HTTP в дополнение к описанным в разделе 10 "Соображения Безопасности" спецификации SOAP 1.2. Часть 1 [ИСО/МЭК 40210, раздел 10]. Разработчики привязок SOAP к HTTP должны тщательно анализировать данный материал.
Приложение A (справочное). Тип медиа "application/soap+xml"
Приложение A
(справочное)
Исходное содержимое данного раздела неактуально (см. RFC3902 [RFC 3902]).
Приложение B (справочное). Отображение имен, определенных приложениями, в имена XML
Приложение B