БИБЛИОТЕКА НОРМАТИВНЫХ ДОКУМЕНТОВ

ГОСТ Р ИСО/МЭК 40220-2015. Национальный стандарт Российской Федерации. Информационные технологии. W3C SOAP. Версия 1.2. Часть 2. Дополнения (вторая редакция)

9.5. Операции шаблонов обмена сообщениями

Для экземпляров привязок, соответствующих данной спецификации:

- узел SOAP, инстанцированный на клиенте HTTP, может иметь роль (т.е. свойство http://www.w3.org/2002/12/soap/bindingFramework/ExchangeContext/Role) "RequestingSOAPNode";

- узел 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/ImmediateDestination контекста обмена сообщениями

Поле заголовка 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

 

Код состояния

Поясняющая фраза

Значение/Действие

Следующее состояние

2xx

Successful

 

 

200

OK

Сообщение ответа передается в теле объекта ответа HTTP. Начать конструирование абстрактного сообщения ответа в http://www.w3.org/2003/05/soap/mep/InboundMessage

"Sending + Receiving" или "Receiving"

202

OK

Запрос был принят, но или (a) никакой конверт ответа не получен, или (b) получен конверт, представляющий информацию, связанную с запросом - такие конверты СЛЕДУЕТ обрабатывать, используя модель обработки SOAP ([ИСО/МЭК 40210, раздел 5])

"Receiving" (после которого сразу произойдет переход в состояние "Success")

301, 302, 307

Redirect

Запрашиваемый ресурс был перемещен. В случае небезопасного метода HTTP, такого как POST или PUT, для продолжения операции требуется явное подтверждение. В случае безопасного метода, такого как GET, или если перенаправление было подтверждено, СЛЕДУЕТ повторить HTTP запрос, поместив в свойство http://www.w3.org/2003/05/soap/mep/ImmediateDestination значение URI из соответствующего поля заголовка Location

"Init" или "Fail"

303

See Other

Запрашиваемый ресурс был перемещен. СЛЕДУЕТ повторить HTTP запрос, поместив в свойство http://www.w3.org/2003/05/soap/mep/ImmediateDestination значение 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"

4xx

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"

5xx

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 должна понимать класс любого кода состояния, обозначенного первой цифрой, и обрабатывать любой нераспознанный ответ, как являющийся эквивалентным ответу с кодом состояния x00-го класса, с одним исключением - нераспознанный ответ не должен кэшироваться.

Примечание - В инфраструктуре HTTP могут присутствовать элементы, сконфигурированные для изменения сообщения ответа HTTP для кодов состояния 4xx и 5xx. Например, некоторые исходные HTTP сервера имеют такую опцию в качестве конфигурационного параметра. Это поведение может конфликтовать с поведением, использующим ответные коды состояния 4xx и 5xx, передающие сообщения отказа SOAP в HTTP, и рекомендуется, чтобы такое поведение было отключено для ресурсов, принимающих запросы SOAP/HTTP. Если поведение, изменяющее сообщения ответов для кодов состояния 4xx и 5xx не может быть отключено, то 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

env:MustUnderstand

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". С точки зрения локального узла данный обмен сообщениями завершен.