Главная » Java, Web, XML » Пересылка послания по протоколу HTTP

0

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

Тем не менее, SOAP-послания применяются в Web-технологии и поэтому наиболее часто передаются по наиболее распространенному в WWW протоколу HTTP. При этом для посылки запроса применяется метод POST или GET. Спецификация протокола SOAP все-таки задает некоторые правила оформления POST-запроса.

В версии SOAP 1.2 в POST-запросе в поле Content-Type заголовка записывается   содержимого application и специально созданный и зарегистрированный МШЕ-подтип soap+xmi. Короче говоря, в версии SOAP 1.2 HTTP-запрос выглядит так:

POST /services/InfoServlet HTTP/1.1 Host: some.com

Content-Type: application/soap+xml; charset="utf-8" Content-Length: nnnn

<?xml version=’1.0′ ?>

<env:Envelope

xmlns:env="http://www. w3.о rg/2002/06/soap-envelope"> <!—SOAP-послание —> </env:Envelope>

Конечно, в HTTP-заголовке могут быть и другие поля, определенные протоколом

В версии SOAP 1.1 сохранялся старый тип содержимого text/xml и присутствовало нестандартное для HTTP поле soAPAction заголовка, в котором строкой URI указывался адресат SOAP-послания, например:

POST / services / InfoServlet HTTP/1.1 Content-Type: text/xml; charset="utf-8"

Content-Length: nnnn

SOAPAction: "http://some.org/abc#MyMessage" <?xml version=’1.0′ ?> <env:Enve1ope

xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">

—>

</env:Envelope>

Строка URI, записанная в поле SOAPAction заголовка, предназначалась промежуточным серверам или прокси-серверам, не просматривающим тело HTTP-запроса. Пустое значение заголовка, то есть пара кавычек, означало, что адресатом будет строка URI, указанная в заголовке HTTP-запроса после слова POST. Отсутствие поля SOAPAction означало, что адресат не указан.

Версия SOAP 1.2 отказалась от поля                      но, на всякий случай, до

бавила необязательный атрибут action к полю HTTP-заголовка content- Type, имеющий тот же смысл, что и поле SOAPAction. Например:

Content-Type: application/soap+xml; \

charset="utf-8"; action="http: //some. org/abc#MyMessage"

Использование метода GET

Версия протокола SOAP 1.2 позволяет сделать запрос к SOAP-серверу по HTTP-методу GET. GET-запрос состоит только из заголовка, у него нет тела, следовательно, он не может передать SOAP-сообщение. Единственное, что он может сделать — это запросить у SOAP-сервера какое-то SOAP- послание, которое можно определить параметрами, переданными в GET- запросе. Например, можно передать аргументы name и age метода getciockNumbers (), приведенного выше в качестве примера, в заголовке GET-запроса:

GET /services/InfoServlet?name=I4BaHOB&age=27 HTTP/1.1 Host: some.com

Accept: text/html, application/soap+xml

В GET-запросе, в поле заголовка Accept, важно указать тип application/ soap+xml ожидаемого SOAP-послания.

Более того, спецификация SOAP 1.2 рекомендует простые аргументы SOAP- запроса дублировать в заголовке HTTP-запроса даже при пересылке SOAP- запроса методом POST.

Листинг 3.12 показывает обращение к процедуре getciockNumbers о с учетом этой рекомендации.

[ ЛистингЗ.12, Полный SOAP-запрос по методу; POST

POST /services/Inf0Servlet?name=MBaH0B&age=27 HTTP/1.1 Host: some.com

Content-Type: application/soap+xml; charset="utf-8" Content-Length: 553

<?xml version=’ 1.0′ ?>

<env:Envelope

xmlns:env="http://www.w3.org/2002/06/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<env:Body>

<getClockNumbers

env:encodingStyle=

"http://www.w3.org/2002/06/soap-encoding">

<person

xmlns:enc="http://www.w3.org/2 002/06/soap-encoding">

<name xsi:type="xsd:string">HBaHOB</name> <age xsi:type="xsd:int">27</age>

</person>

</getClockNumbers>

</env:Body>

</env:Envelope>

В любом случае, ответ сервера обычен: НТТР/1.1 200 ОК

Content-Type: application/soap+xml; charset="utf-8"

Content-Length: nnnn

<?xml version=’1.0′ ?> <env:Envelope

xmlns:env="http://www.w3.org/2002/06/soap-envelope" > < ! — SOAP-ответ сервера —> </env:Envelope>

В случае ошибки при обработке SOAP-послания Web-сервер должен дать КОД ответа не 200 ок, а 400 Bad Request ВДД 500 Internal Server Error. Код 400 записывается при возникновении SOAP-ошибки "sender", а код 500 — при появлении ошибок "VersionMismatch", "MustUnderstand",

"Receiver".

Пересылка послания по протоколу SMTP

Правила пересылки SOAP-послания версии 1.2 по почтовому протоколу, описываются спецификацией "SOAP 12 по Email" ("SOAP Version 1.2 Email

Binding") (http://www.w3.org/TR/soapl2-email/). Впрочем, эти правила не добавляют ничего нового ни к правилам оформления SOAP-послания, ни к правилам оформления почтового сообщения, а только фиксируют их. Просто SOAP-послание служит телом обычного почтового сообщения. Вот пример почтового сообщения, содержащего SOAP-послание:

From: ivanQsone. com

То: petr@another.com

Subject: Some Message

Date: Mon, 18 Nov 2002 13:20:00 GMT

Message-Id: <EE4 92E16A09009027 6D208424 9 60C0C@some.com>

<?xml version^’1.0 ‘ ?> <env:Enve1ope

xmlns:env="http://www.w3.org/2002/06/soap-envelope">

… Здесь SOAP-послание самого обычного вида… </env:Envelope>

Литература:

Хабибуллин И. Ш. Разработка Web-служб средствами Java. — СПб.: БХВ-Петербург, 2003. — 400 с: ил.

По теме:

  • Комментарии