Главная » Java, Web, XML » Процедурный стиль SOAP

0

Послание, предназначенное для вызова удаленной процедуры или обращения к методу удаленного объекта, оформляется очень просто.

В тело <Body> послания помещается одна структура, имя которой совпадает с именем вызываемой процедуры или метода. В полях структуры перечисляются аргументы процедуры или метода. Имена полей совпадают с именами аргументов, порядок следования полей в структуре совпадает с порядком следования аргументов в заголовке процедуры или метода.

Версия SOAP 1.2 позволяет вместо структуры записать массив, имя которого совпадает с именем вызываемой процедуры или метода, а элементы содержат значения аргументов процедуры или метода, причем элементы массива должны строго соблюдать порядок следования аргументов в процедуре или методе.

Пусть, например, SOAP-послание хочет обратиться к методу public String getAddress (String name, int number); следующим образом:

String address = getld("Иванов", 2345678); Послание будет выглядеть так:

Листинг 3.5. SOAP-запрос процедуры

<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>

<getAddress xmlns="http://www.gts.com/inquiries"

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

<name

cnumber xsi:type="xsd:int">2345678</number> </getAddress>

</env:Body>

</env:Envelope>

В версии SOAP 1.1 ответ сервера записывается в теле <Body> одной структурой. Имя структуры не имеет значения, но по общему соглашению обычно повторяется имя процедуры с добавлением слова "Response". Для каждого выходного аргумента процедуры записывается поле структуры, содержащее значение этого аргумента. Имя поля совпадает с именем аргумента. Возвращаемое значение процедуры или метода заносится в первое поле этой структуры. Имя этого первого поля не имеет значения.

Листинг 3.6 показывает ответ сервера, содержащий результат обращения к методу getAddress () В версии SOAP 1.1.

Листинг 3.6. Ответ сервера с результатом работы процедуры. Версия SOAP 1.1

<env:Envelope

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

<env:Body>

<getAddressResponse env:encodingStyle=

"http://schemas.xmlsoap.org/soap/encoding/">

<result xsi:type="xsd:string">CaflOBaH, 25-4</result> </getAddressResponse> </env:Body> </env:Envelope>

В версии SOAP 1.2 возвращаемое значение процедуры или метода записывается по-другому. Сначала определяется имя элемента, в тело которого будет помещено возвращаемое значение. Имя элемента определяется в теле элемента <rpc: resuit>, который определен в пространстве имен с идентификатором http://www.w3. org/2002/06/soap-rpc. Этому идентификатору обычно дается префикс грс. Например:

<rpc:result>address</rpc:result> <address>CaflOBan, 25-4</aodress>

Смысл такого двухступенчатого определения в том, чтобы дать возможность проверки типа возвращаемого значения.

Результат работы процедуры или метода в версии SOAP 12 можно записать не только структурой, но и массивом. При этом возвращаемое значение должно быть первым элементом массива, следующие элементы должны содержать значения выходных аргументов процедуры в порядке их расположения в заголовке процедуры.

Листинг 3.7 показывает ответ сервера с результатом работы процедуры getAddress О В версии SOAP 1.2.

• Листинг 3.7. Ответ сервера с результатом работы процедуры. Версия SOAP1.2

<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>

<getAddressResponse

xmlns:rpc="http://www.w3.org/2002/06/soap-rpc"

env:encodingStyle="http://www.w3.org/2 002/0 6/soap-encoding">

<rpc:result>address</rpc:result>

<address> Садовая, 25-4</address> </getAddressResponse> </env:Body> </env:Envelope»

Сложные аргументы и результаты

Аргументы процедуры или метода и их возвращаемые значения, имеющие сложные типы, следует записывать при пересылке массивами или

структурами. Пусть, например, в Web-службе есть класс, описывающий человека:

public class Person)

String name; // Имя. int age; // Возраст.

public

public Person(String name, int age){ = name; = age;

}

public String getName(){ return name; }

public void setName (String name) { this.name = name; }

public int getAge(){ return age; }

public void setAge(int age){ this.age = age; }

}

Этот класс используется в описании сотрудника: public class Employee!

Person pers; // Имя и возраст сотрудника, int numb; // Табельный номер сотрудника.

public

public Person getPerson(){ return pers; }

public void setPerson(Person pers){ this.pers = pers; }

public int getNumb(){ return numb; }

public void setNumb(int numb)) this.numb = numb; }

}

Допустим, что в этой Web-службе, в классе info, есть метод, возвращающий список табельных номеров сотрудников, составленный по их имени и возрасту:

public int[] getClockNumbers(Person person);

Обращение клиента к методу getClockNumbers о будет выглядеть так:

Person ivanov = new Person("Иванов", "27") ; Info inf = new Info();

int[] numbs = inf.getClockNumbers(ivanov);

Сложный аргумент ivanov можно передать структурой, как показано в листинге 3.9.

Листинг 3.9. Передача объекта структурой

<?xml version=’1.О’ ?>

<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/2002/06/soap-encoding">

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

</person>

</getClockNumbers>

</env:Body>

</env:Envelope>

Можно передать аргумент ivanov и массивом, как показано в листинге 3.10.

.’ Листинг 3.10. Передача объекта массивом

<?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/XMLScb?na,,>

<env:Bocly>

<getClockNumbers

env:encodingStyle=

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

<params

xmlns:enc="http://www.w3.org/2002/06/soap-encoding"

xsi:type="enc:Array"

enc:arrayType="xsd:anyType[2]">

<itemxsi:type="xsd:string">HBaHOB</item> <item xsi: type="xsd: int">27</item>

</params >

</getClockNumbers> </env:Body> </env: Envelopes

Ответ сервера с результатом выполнения метода getClockNumbers (), оформленным в виде массива, показан в листинге 3.11.

Листинг 3.11. Результат

<?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>

<getClockNumbersResponse

env:encodingStyle=

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

<return

xmlns:enc="http://www.w3.org/2002/06/soap-encoding/" xsi:type="enc:Array" enc:arrayType="xsd:int[4]">

citem xsi:type="xsd:int">678456</item> <item xsi:type="xsd:int">256830</item> <item xsi:type="xsd:int">132587</item> <item xsi:type="xsd:int">563904</item>

</’return>

</getClockNumbersResponse>

</env:Body> </env:Envelope>

Литература:

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

По теме:

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