Пишем SOAP клиент-серверное приложение на PHP / Хабр

.

SOAP (от англ.Simple Object Access Protocol — простой протокол доступа к объектам) — протокол обмена структурированными сообщениями в распределённой вычислительной среде.

Введение в SOAP

Первоначально SOAP предназначался в основном для реализации удалённого вызова процедур (RPC). Сейчас протокол используется для обмена произвольными сообщениями в формате XML, а не только для вызова процедур. Официальная спецификация последней версии 1.2 протокола никак не расшифровывает название SOAP. SOAP является расширением протокола XML-RPC.

SOAP может использоваться с любым протоколом прикладного уровня: SMTP, FTP, HTTP, HTTPS и др. Однако его взаимодействие с каждым из этих протоколов имеет свои особенности, которые должны быть определены отдельно. Чаще всего SOAP используется поверх HTTP.

SOAP является одним из стандартов, на которых базируются технологии веб-служб.

Структура протокола

Сообщение SOAP выглядит так:

SOAP-конверт

Пример

Пример SOAP-запроса на сервер интернет-магазина:

<soap:Envelopexmlns:soap=»http://schemas.xmlsoap.org/soap/envelope/»><soap:Body><getProductDetailsxmlns=»http://warehouse.example.com/ws»><productID>12345</productID></getProductDetails></soap:Body></soap:Envelope>

Пример ответа:

<soap:Envelopexmlns:soap=»http://schemas.xmlsoap.org/soap/envelope/»><soap:Body><getProductDetailsResponsexmlns=»http://warehouse.example.com/ws»><getProductDetailsResult><productID>12345</productID><productName>Стакан граненый</productName><description>Стакан граненый. 250 мл.</description><price>9.95</price><currency><code>840</code><alpha3>USD</alpha3><sign>$</sign><name>US dollar</name><accuracy>2</accuracy></currency><inStock>true</inStock></getProductDetailsResult></getProductDetailsResponse></soap:Body></soap:Envelope>

Недостатки

  • Использование SOAP для передачи сообщений увеличивает их объём и снижает скорость обработки. В системах, где скорость важна, чаще используется пересылка XML-документов через HTTP напрямую, где параметры запроса передаются как обычные HTTP-параметры.

См. также

Ссылки

Tips for Users:

  • If you know the WSDL file, you can setup a quick link to the client forms using
    http://www.soapclient.com/soapclient?template=/clientform.html&fn=soapform
      &SoapTemplate=none&SoapWSDL=Your_WSDL_File
    or
       http://www.soapclient.com/soapTest.html?SoapWSDL=Your_WSDL_File

  • The server caches WSDL files in normal operations to improve performance. If you make any changes to a WSDL file,  select  the No checkbox.

Tips for Developers:

  • Use <documentation> whenever possible in your WSDL file to provide instructions. It will be displayed in the client form.

  • Use enumeration type if an element has fix number of values.

    XML веб сервисы. Протокол SOAP

    They will be displayed as dropdown boxes.

Key Features:

  • Support both 1999 and 2001 XML schema. The tool uses the schema defined in the WSDL file for constructing SOAP requests.

  • Support array and array of structs. Only single dimensional arrays are supported. Sorry, no sparse arrays.

  • Capable of serializing complex data types and array of complex data types, even multi-level embedded structs.

  • Handling ID/HREF in both SOAP messages and schema definitions.

  • Support both SOAP section 5/7 and document/literal encodings..

Technical Details  — Dynamic Binding of SOAP Services

A binding is a contract between the client logic and server logic. There are two types of bindings in SOAP: Object binding (or SOAP binding) and parameter binding. Most of the SOAP toolkits perform static object bindings by generating client side proxy objects. The problem is that, unlike the traditional programming module where objects/interfaces are stable, web services are subject to change at any moment without notice, because they are often owned/controlled by a third party. Another problem occurs when the number of web services to be accessed increases, the generated source code could quickly becomes a maintenance nightmare. Finally, when the web services to be accessed are unknown, which is more often then likely, early binding becomes impossible, or at least difficult. Generating a proxy object for a service to be built in the future is an interesting research project. 

The generic SOAP client demonstrates dynamic bindings (or run-time bindings) of SOAP services and parameters. An object is generated at execution time when WSDL file is specified, and parameter values are associated with a SOAP message just before delivery. The late binding (or delayed binding) technique could greatly reduces maintenance cost, because a single client can be used to access many web services.

The tool, written in less than 20 lines of code with SOAP Client Library, is a live example of how to build generic SOAP applications using the late-binding technique.

Other Tools:

Web-сервис SOAP в Eclipse

Что такое веб-сервис SOAP (Simple Object Access Protocol) и с чем его «едят»? В предыдущей статье было сказано, что web-сервисы представляют собой процесс взаимодействия приложений по протоколу HTTP, а SOAP определяет протокол реализации web-сервиса и является дальнейшим развитием XML-RPC (XML-вызов удалённых процедур). Если не вдаваться в сложности процесса взаимодействия клиент/серверных приложений, то можно сказать, что имеется некий сервер, который управляет информацией (добавляет, удаляет, обновляет, хранит) и выдает клиентам информацию по запросам в формате XML. Клиенты могут обращаться к такому серверу только по протоколу HTTP с оформлением запроса в формате XML. Т.е. клиент с сервером обмениваются только XML-информацией, и ни каких картинок, аудио, видео. Такой сервер может предоставлять информацию (веб-сервис) о погоде, об авиационном или железнодорожном расписании, о курсе валют и т.д.

Каждый web-сервис SOAP имеет описание в виде файла wsdl. WSDL (Web Services Description Language) — язык описания веб-сервисов и доступа к ним в формате XML.

В данной статье рассмотрим вопрос создания WEB-сервиса SOAP в IDE Eclipse с практической точки зрения. Т.е. создадим, запустим и протестируем веб-сервис SOAP. Как говорится, лучше один раз, чем ни разу.

Apache Axis

Для разработки WEB-сервиса были использованы Eclipse Luna (4.4.2), Apache Tomcat v8.5.4 и Apache Axis. Полагаю, что версии Eclipse и Tomcat не критичны для решения данной задачи. Можно использовать и другие версии.

Особо следует сказать об Apache Axis (Apache eXtensible Interaction System), который является фреймворком веб-сервиса с открытым исходным кодом. AXIS включает в себя контейнер для размещения и использования веб-сервисов на серверах приложений, утилиты для работы с WSDL-описаниями, классы для разработки веб-сервисов и их клиентов. В нашем примере AXIS будет использоваться для создания и тестирования WEB-сервиса и вызываться он будет из Eclipse.

Описание примера

Чтобы в Eclipse создать простейший WEB-сервис SOAP, а потом запустить его и протестировать, надо хорошо знать Eclipse, поскольку он всё сделает сам, включая создание файла wsdl.

Поэтому кодировать придется очень мало, а в большей степени разбираться со скриншотами интерфейса IDE Eclipse.

Создадим WEB-сервис, который управляет персоналом и позволяет добавлять и удалять сотрудников, просматривать список сотрудников и выполнять поиск сотрудника по идентификатору.

Обзор SOAP

Начнем с проекта, тип которого в Eclipse должен быть ‘Dynamic Web Project’. Определим наименование проекта как ‘SoapServer’ :

В проекте создадим класс сотрудника Person, интерфейс описания методов PersonService и класс реализации методов PersonServiceImpl. На этом программирование заканчивается.

Листинг класса Person

Класс сотрудника включает идентификатор id и имя name (проще и не придумать). Также в классе определим методы get/set.

package com.example; import java.io.Serializable; public class Person implements Serializable { private static final long serialVersionUID = 1L; private int id; private String name; public Person() {} public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }

Листинг интерфейса PersonService

Интерфейс определяет методы добавления нового сотрудника addPerson, удаление сотрудника deletePerson, получение сотрудника по идентификатору getPerson и чтение списка сотрудников getPersons.

package com.example; public interface PersonService { public boolean addPerson (Person p); public boolean deletePerson(int id); public Person getPerson (int id); public Person[] getPersons (); }

Листинг класса PersonServiceImpl

Класс PersonServiceImpl реализует методы интерфейса.

package com.example; import java.util.Map; import java.util.Set; import java.util.HashMap; public class PersonServiceImpl implements PersonService { private static Map<Integer,Person> persons; public PersonServiceImpl() { if (persons == null) persons = new HashMap<Integer,Person>(); } @Override public boolean addPerson(Person p) { if (persons.get(p.getId()) != null) return false; persons.put(p.getId(), p); return true; } @Override public boolean deletePerson(int id) { if (persons.get(id) == null) return false; persons.remove(id); return true; } @Override public Person getPerson(int id) { return persons.get(id); } @Override public Person[] getPersons() { Set<Integer> ids = persons.keySet(); Person[] p = new Person[ids.size()]; int i = 0; for(Integer id : ids){ p[i] = persons.get(id); i++; } return p; } }

Примечание : при каждом вызове сервиса (одного из его методов) создается объект PersonServiceImpl, в конструкторе которого выполняется проверка создания коллекции сотрудников.

Поэтому коллекция сотрудников объявлена статической.

Cоздание WEB-сервиса SOAP

Для создания WEB-сервиса необходимо выделить реализацию интерфейса PersonServiceImpl и в контекстном меню, вызываемом правой клавишей мыши, выбрать ‘Web Service’ (New/Other/Web Services/Web Service). Будет открыто окно мастера создания веб-сервиса, в котором представлена конфигурация создания веб-сервиса, включающая Tomcat, Apache Axis и наш проект SoapServer (вот где объявилась среда разработки в виде Tomcat и Apache Axis).

Здесь можно ничего не делать, только проверьте ‘Service Implementation’, чтобы был выбран соответствующий класс, установите галочки публикации и мониторинга веб-сервиса в нижней части формы (‘Publish the Web service’, ‘Monitor the Web service’) и можно переходить к следующему шагу нажатием кнопки Next.

На этом шаге будет представлен список всех методов веб-сервиса (класса реализации интерфейса), описанных в файле PersonServiceImpl.wsdl :

Можно завершить процесс создания WEB-сервиса нажатием кнопки Finish. Но из любопытства все же заглянем в последнее окно и нажмем кнопку Next.

Здесь мы видим, что мастер завершил свою работу и предлагает стартовать Tomcat. Нажимаем на кнопку ‘Start server’ и завершаем после этого работу с мастером. Теперь можно посмотреть, что сделал мастер разработки WEB-сервиса с нашим проектом.

Структура проекта WEB-сервиса SOAP

Мы только создали два класса и интерфейс, а остальное создал мастер, включая поддиректорию с файлами WEB-INF/PersonServiceImplService, файл WEB-INF/server-config.wsdd и описание сервиса в виде PersonServiceImpl.wsdl в поддиректории WEB-INF/wsdl. Он же внес в дескриптор приложения web.xml изменения, связанные с web-сервисом.

В скриншоте не развернута директория lib, в которую мастер включил необходимые для веб-сервиса библиотеки jar :

  • axis.jar
  • commons-discovery-0.2.jar
  • commons-logging.jar
  • jaxrpc.jar
  • saaj.jar
  • wsdl4j.jar

Дескриптор приложения web.xml

В дескриптор приложения вносить изменений не требуется, если не считать удаление отсутствующих в проекте открываемых страниц по умолчанию (секция <welcome-file-list>. Мастер создания веб-сервиса всю необходимую информацию вписал сам.

<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <display-name>SoapServer</display-name> <!— <welcome-file-list> </welcome-file-list> —> <servlet> <display-name>Apache-Axis Servlet</display-name> <servlet-name>AxisServlet</servlet-name> <servlet-class> org.apache.axis.transport.http.AxisServlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>/servlet/AxisServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>*.jws</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>AxisServlet</servlet-name> <url-pattern>/services/*</url-pattern> </servlet-mapping> <servlet> <display-name>Axis Admin Servlet</display-name> <servlet-name>AdminServlet</servlet-name> <servlet-class> org.apache.axis.transport.http.AdminServlet </servlet-class> <load-on-startup>100</load-on-startup> </servlet> <servlet-mapping> <servlet-name>AdminServlet</servlet-name> <url-pattern>/servlet/AdminServlet</url-pattern> </servlet-mapping> </web-app>

Старт WEB-сервиса SOAP

Для работы с веб-сервисом необходимо стартовать (если еще не стартовано) web-приложение SoapServer. Для этого, нажимая правой клавишей мыши на проекте, вызываем контекстное меню и выбираем ‘Run As/Run on Server’. В открывшемся окне выбора сервера приложений выделяем Tomcat и нажимаем кнопку Finish.

В браузере будет открыта страница проекта по умолчанию, которой у нас нет. Браузер/вкладку с открывшейся с ошибкой страницей можно закрыть, она нам не пригодится. На вкладке серверов (скриншот ниже) можно увидеть, что сервер стартован и приложение SoapServer загружено в его контейнер.

Для старта приложения управления веб-сервисом Axis необходимо найти и нажать в панели инструментов кнопку, представленную на следующем скриншоте с подсказкой ‘Launch the Web Service Explorer’.

В результате в браузере будет открыта страница Web Services Explorer, интерфейс которой представлен на следующем скриншоте. Окно приложения Web Services Explorer включает панель инструментов с кнопками (справа вверху) и три области : Navigator, Actions, Status. На строку URL не обращаем внимания, нам с ней не работать.

Первое, что нам необходимо, так это выбрать режим WSDL. Для этого в панели инструментов находим нужную нам кнопку и нажимаем. Корневым элементом в дереве Navigator’а отобразиться ‘WSDL Main’ и в панели Actions
будут представлены компоненты для работы с WSDL (скриншот сверху). Здесь можно подключиться к веб-сервису в Интернете. Но мы пойдем другим путём и выберем наш файл PersonServiceImpl.wsdl с описанием веб-сервиса из запущенного проекта SoapServer. Вводим в строке соответствующий адрес URI, начинающийся с file: и нажимаем кнопку ‘GO’. Если всё правильно сделано и всё работает, то в Navigator’e будет отображена структура нашего WEB-сервиса, как это представлено на следующем скриншоте.

Переходим к тестированию методов WEB-сервиса. Выполним только добавление новых сотрудников и просмотрим список. Остальные методы Вы можете проверить самостоятельно.

Добавление сотрудника

Для добавления нового сотрудника выделяем соответствующий метод в Navigator’e; в панели Actions в секции Body будет представлен выбранный метод и параметры. Вводим идентификатор, русскоязычное имя ‘Всеволод’ и нажимаем кнопку GO. Результат выполнения метода веб-сервиса можно увидеть в панели Status.

Чтобы просмотреть текст запроса и ответа веб-сервиса в панели Status нажимаем на link ‘Source’. В результате в интерфейсе панели (скриншот ниже) будут открыты компонент с описанием запроса ‘SOAP Request Envelope’ и компонент с описанием ответа ‘SOAP Response Envelope’ в формате XML. Обратите внимание, что русскоязычное имя в запросе отображено в виде вопросительных знаков. После этого были добавлены еще два сотрудника Serg (id=2) и Olga (id=3).

Чтение списка сотрудников

А как будет представлен сотрудник в списке, имя которого имеет кириллицу? Выделяем в Navigator’e метод getPersons, нажимаем кнопку ‘GO’ и смотрим результат запроса в панели Status в режиме Form (следующий скриншот). Всё нормально, имя представлено верно в кириллице. Т.е. не потребовалось «изголяться» с charset’ами для передачи и чтения текстовой информации не в ASCII-коде.

Но вот при просмотре запроса и ответа в панели Status в режиме Source видим, что кириллица отображается в виде вопросительных знаков.

Заключение

В статье был рассмотрен вопрос создания и тестирования WEB-сервиса в IDE Eclipse. Основную цель, которую я преследовал при изложении данной информации, показать, что такое WEB-сервис SOAP, как его можно практически создать и протестировать. Представленный материал должен позволить Вам взглянуть во «внутренности» WEB-сервиса SOAP и понять сущность данной технологии.

Создание клиента WEB-сервиса на примере рассмотрен здесь. Второй пример SOAP клиента с авторизацией представлен здесь.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *