Что значит "понять" заголовок мыла, помеченный "mustunderstand",

Я узнаю о SOAP. Я вижу, что некоторые элементы заголовка имеют атрибут "mustunderstand", который может быть установлен как true или false. Но что значит "понимать" мыльное сообщение? Проанализировать его без ошибок? Я нашел несколько сайтов, которые не действительно объяснить это.

Может кто-нибудь дать мне краткое изложение того, что происходит?

Ответ 1

Чтобы позвонить в веб-сервис, вам необходимо соблюдать его контракт. Если веб-служба имеет <operationA> и <operationB>, но вы отправите ей <operationC>, вы получите сообщение об ошибке (ошибка в языке SOAP).

Веб-служба имеет операции <operationA> и <operationB> и знает, что делать с сообщением, когда сообщение содержит <operationA> или <operationB>. Но он не имеет <operationC> и не знает, что делать с сообщением, содержащим <operationC>, поэтому он просто возвращает ошибку. Неправильное тело нельзя игнорировать, но заголовки, с другой стороны, не имеют ограничений на то, что они есть, поэтому вам нужен другой механизм, чтобы правильно их обрабатывать.

Заголовки используются для расширения сообщения путем добавления поддержки транзакций, аутентификации, маршрутизации и т.д. и т.д. Но эти расширения не определены в спецификации SOAP, они определены пользователем. В спецификации просто сказано, что для этого используются заголовки, а также указывает, как сообщение должно обрабатываться при наличии заголовков. Атрибут mustUnderstand является частью "способа обработки сообщения".

Сообщение SOAP отправляется от отправителя до конечного пункта назначения, возможно, путем прохождения через посредство SOAP-посредников вдоль пути сообщения. Заголовок может быть нацелен на конкретный node или на последний node (т.е. Атрибут SOAP 1.1 actor или SOAP 1.2 role), а когда это произойдет, node должен что-то сделать с заголовком. Это может быть либо использование, либо игнорирование.

Атрибут mustUnderstand указывает, является ли обработка заголовка необязательной или обязательной. В основном это означает, что node пытается найти соответствующий обработчик, соответствующий заголовку, и приступить к обработке сообщения в соответствии с его спецификацией. Если он не может найти соответствующий обработчик, он должен вернуть ошибку и прекратить дальнейшую обработку. Если mustUnderstand истинно /1, node не может игнорировать его.

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

Атрибут SOAP mustUnderstand позволяет обеспечить надежную эволюцию. Элементы, отмеченные атрибутом SOAP mustUnderstand со значением "1", ДОЛЖНЫ считаться каким-то образом модифицировать семантику своих родительских или одноранговых элементов. Элементы меток таким образом гарантируют, что это изменение в семантике не будет молча (и, предположительно, ошибочно) игнорироваться теми, кто не может полностью понять это.