Каталог Индекс раздела
Назад Оглавление Вперед

Лабораторная работа № 5.
Применение классов пакета javax.xml.soap для работы с веб-сервисами

Цель работы: Задание:
Разработать программу для взаимодействия с методами веб-сервиса, использовавшимися в предыдущей лабораторной работе. Программа должна уметь формировать и отправлять сообщения веб-сервису, получать и обрабатывать результаты ответов веб-сервиса, включая Fault сообщения.

Справочная информация:
В пакета javax.xml.soap предусмотрена возможность отсылать SOAP сообщений конечным точкам (endpoints) и получать от них результаты. Отсылка сообщений осуществляется следующим образом:
  1. с помощью метода newInstance класса javax.xml.soap.SOAPConnectionFactory создается экземпляр класса SOAPConnectionFactory.
  2. с помощью метода createConnection созданного экземпляра класса SOAPConnectionFactory создается экземпляр класса SOAPConnection.
  3. вызывается метод call или get созданного экземпляра класса SOAPConnection.

Пример выполнения
В данном примере мы не будет приводить полный текст программы, ограничившись описанием наиболее важных моментов. Вся функциональность по работе с веб-сервисом Countries web service сосредоточена в классе CountriesWebServiceClient. Методы классы представлены на рис.1:
Рисунок 1. Методы класса CountriesWebServiceClient

Примечание. Веб-сервис, выбранный нами в предыдущей работе, использует стандарт SOAP версии 1.1, поэтому при создании SOAP сообщений мы указывали соответствующую версию:
SOAPMessage animalSOAP = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL).createMessage();

Метод callWebServiceMethod
Назначение метод - отсылка SOAP сообщения по указанному адресу и возврат полученного результата. Приведем этот метод полностью:

	/**
	 * Метод отправляет запрос веб-сервису и возвращает ответ.
	 * @param request - SOAP сообщение-запрос, отправляемое веб-сервису
	 * @param address - адрес веб-сервиса
	 * @return - ответ веб-сервиса
	 * @throws SOAPException 
	 * @throws UnsupportedOperationException 
	 * */
	public static SOAPMessage callWebServiceMethod(SOAPMessage request, Object address) throws UnsupportedOperationException, SOAPException
	{
		SOAPConnection connection = null;
		try 
		{
			SOAPMessage response = null;   
			
			//создаем экземпляр SOAPConnectionFactory
			SOAPConnectionFactory connectionFactory = SOAPConnectionFactory.newInstance();
			//создаем новое SOAPConnection соединение
			connection = connectionFactory.createConnection();
			
			response = connection.call(request, address);
			
			//проверяем является ответ Fault сообщением
			if (response.getSOAPBody().hasFault())
			{
				parseFault(response);
				throw new SOAPException(); 
			}
			
			return response;
		} 
		finally
		{
			connection.close();
		}
	}
Параметрами метода являются сообщение, которое необходимо отправить веб-сервису, и адрес веб-сервиса. В методе создается экземпляр класса SOAPConnection и вызывается его метод call. Результатом выполнения метода call является SOAP сообщение. Мы проверяем содержит ли оно в теле Fault элемент. Если Fault элемент присутствует, то мы вызываем метод parseFault, который обрабатывает Fault сообщение, и выбрасываем новое исключение SOAPException. В любом случае последним действием мы закрывает открытое соединение (блок finally).

Метод public static SOAPMessage createGetIANAInfoRequest() throws SOAPException
Назначение метода - создание запроса к методу веб-сервиса getIANAInfo. Данный метод веб-сервиса не имеет входных параметров, поэтому они отсутствуют и в нашем методе.

Метод public static String parseGetIANAInfoResponse(SOAPMessage message, String countryName) throws SOAPException
Назначение данного метода - поиск IANA кода для заданной страны. Параметры метода - ответ метода веб-сервиса getIANAInfo и название страны. Метод разбирает полученное SOAP сообщение, находит элемент countryname с заданной страной и возвращает значение элемента ianacode.

Метод public static SOAPMessage createCountryInfoByIanaRequest(String ianacode) throws SOAPException
Назначение метода - создание запроса к методу веб-сервиса countryInfoByIana. Параметр метода - IANA код страны.

Метод public static float[] parseCountryInfoByIanaResponse(SOAPMessage message, String ianaCode) throws SOAPException
Назначение метода - поиск широты и долготы страны с заданным IANA кодом. Параметры метода - ответ метода веб-сервиса countryInfoByIana и IANA код страны. Метод разбирает полученное SOAP сообщение, находит элементы latitude и longitude, заносит их в массив типа float, который и возвращает.

Метод public static SOAPMessage createRegionsInfoByIanaRequest(String ianacode) throws SOAPException
Назначение метода - создание запроса к методу веб-сервиса regionsInfoByIana. Параметр метода - IANA код страны.

Метод public static float[] parseRegionsInfoByIanaResponse(SOAPMessage message, String regionName) throws SOAPException
Назначение метода - поиск широты и долготы региона с заданным IANA кодом. Параметры метода - ответ метода веб-сервиса regionsInfoByIana и название региона. Метод разбирает полученное SOAP сообщение, находит элемент regionname с заданным именем, выбирает для него значения элементов latitude и longitude, заносит их в массив типа float, который и возвращает.

Метод public static void parseFault(SOAPMessage message) throws SOAPException
Назначение метода - обработка Fault сообщения. Этот метод просто печатает данные об ошибке на экран:

	/**Разбор Fault сообщения и печать данных об ошибке*/
	public static void parseFault(SOAPMessage message) throws SOAPException
	{
		SOAPFault fault = message.getSOAPBody().getFault();
		System.out.println("fault code = " + fault.getFaultCode());
		System.out.println("fault actor = " + fault.getFaultActor());
		System.out.println("fault string = " + fault.getFaultString());
		System.out.println("detail = " + fault.getDetail());
	}


В методе main мы демонстрируем работу наших методов. Описывать метод мы не будем, всё должно быть понятно из комментариев:

	public static void main(String[] args) throws SOAPException {
		//адрес нашего веб-сервиса
		String webServiceAddress = "http://www.mobilefish.com/services/web_service/countries.php";
		
		String countryName = "Ukraine"; 
		
		/*-------------Получение IANA кода Украины-------------*/
		//создания запроса к методу веб-сервиса getIANAInfo 
		SOAPMessage msg = createGetIANAInfoRequest();
		
		//выполнение метода веб-сервиса getIANAInfo
		SOAPMessage response = callWebServiceMethod(msg, webServiceAddress);
		
		//выборка из ответа IANA кода Украины
		String ianaCodeOfUkraine = parseGetIANAInfoResponse(response, countryName);
		System.out.println("IANA код Украины: " + ianaCodeOfUkraine);
		/*-----------------------------------------------------*/
		
		/*-------------Получение широты и долготы Украины------*/
		//создания запроса к методу веб-сервиса countryInfoByIana
		msg = createCountryInfoByIanaRequest(ianaCodeOfUkraine);
		
		//выполнение метода веб-сервиса countryInfoByIana
		response = callWebServiceMethod(msg, webServiceAddress);
		
		//выборка из ответа данных Украины
		float[] countryInfo = parseCountryInfoByIanaResponse(response, countryName);
		System.out.println("Широта Украины: " + countryInfo[0]);
		System.out.println("Долгота Украины: " + countryInfo[1]);
		/*-----------------------------------------------------*/		

		/*-------------Получение широты и долготы Харькова-----*/
		//создания запроса к методу веб-сервиса regionsInfoByIana
		msg = createRegionsInfoByIanaRequest(ianaCodeOfUkraine);
		
		//выполнение метода веб-сервиса regionsInfoByIana
		response = callWebServiceMethod(msg, webServiceAddress);
		
		//выборка из ответа данных Харькова
		float[] regionInfo = parseRegionsInfoByIanaResponse(response, "Kharkiv");
		System.out.println("Широта Харькова: " + regionInfo[0]);
		System.out.println("Долгота Харькова: " + regionInfo[1]);
		/*-----------------------------------------------------*/
		
		/*-------------Демонстрация обработки Fault сообщения--*/
		//создания запроса к методу веб-сервиса countryInfoByIana с заведомо неправильным IANA кодом
		msg = createCountryInfoByIanaRequest("_ua_");
		//вызов метода веб-сервиса, который в данном случае вернет Fault
		response = callWebServiceMethod(msg, webServiceAddress);
		/*-----------------------------------------------------*/
	}


Результат работы программы:

IANA код Украины: ua

Широта Украины: 48.379433
Долгота Украины: 31.165581

Широта Харькова: 49.991886
Долгота Харькова: 36.257099

fault code = SOAP-ENV:1000
fault actor = null
fault string = You must supply a valid IANA code.
detail = Valid IANA country codes can be found at: http://www.mobilefish.com/tutorials/countrycodes/countrycodes.html


Содержание отчета:
Каталог Индекс раздела
Назад Оглавление Вперед