|
Модераторы: LSD, AntonSaburov |
|
Domestic Cat |
|
||||||||||||
Эксперт Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 13 Всего: 172 |
Веб сервис на Java
Многие книжки по .NET, особенно для начинающих, содержат главу по веб сервисам. Автор с многозначительным видом рассказывает как это хорошо; и далее с ловкостью фокусника создает веб сервис в течение одной минуты - мол, выбираем асп.нет веб сервис, добавляем метод с аттрибутом и вуаля ! Круто! Микрософть рулез! Некоторое время Java отставала. Был создал Apache SOAP, штука не очень удобная, так сказать. Недавно я так и не смог установить Xerces в Tomcat 5, необходимый для работы с апачевским SOAP. Вроде как tomcat должен пользовать именно xerces, а не свой парсер, потому он должен грузиться первее; как это проделать в tomcat 3 я вроде знаю, а вот с 5 непонятно. Пытался я недолго. Да неважно. Т.к. есть еще наш ответ .NET - Apache Axis. Вот о нем пойдет разговор. Мы, буквально за 1 минуту создадим веб сервис, но первоначально поговорим о том, что для этого нужно. Инсталляция Все инструкции по инсталяции даны для UNIX (bsh шелл). 1. Нам нужен Томкет. У меня стоит 5.0.19. Скачать можно здесь: http://jakarta.apache.org/site/binindex.cgi#tomcat 2. Инсталлируем Томкет. а. Разархивируем архив, скажем, в папку tomcat5. б. Устанавливаем привилегии 777 для файлов startup.sh, shutdown.sh. в. Прописываем пути $> export CATALINA_HOME=/Users/cat/tomcat5/ $> export JAVA_HOME=/Library/Java/Home Естественно, что пути должны быть свои. 3. Тянем Axis. http://ws.apache.org/axis/releases.html Я использую 1.2RC2. 4. Устанавливаем его: переносим папку axis-1_2RC2/webapps/axis в tomcat5/webapps 5. Тянем xerces: http://xml.apache.org/xerces2-j/download.cgi У меня Xerces-J-bin.1.4.4 6. Переносим файл Xerces-J-bin.1.4.4/xerces.jar в tomcat5/webapps/axis/WEB-INF/lib 7. Прописываем CLASSPATH: $> export C=/Users/cat/tomcat5/webapps/axis/WEB-INF/lib $> export CLASSPATH=$C/axis.jar:$C/commons-logging.jar:$C/axis-ant.jar:$C/commons-discovery.jar: $C/jaxrpc.jar:$C/log4j-1.2.8.jar:$C/saaj.jar:$C/wsdl4j.jar:$C/xerces.jar 8. Запускаем Томкет: $> $CATALINA_HOME/bin/startup.sh 9. Если все работает правильно, появится следующее: Using CATALINA_BASE: /Users/cat/tomcat5 Using CATALINA_HOME: /Users/cat/tomcat5 Using CATALINA_TMPDIR: /Users/cat/tomcat5/temp Using JAVA_HOME: /Library/Java/Home/ 10. Проверяем Axis: заходим по ссылке http://localhost:8080/axis/ Мы увидим следующее:
Web Service! Теперь мы готовы - замеряем время ! Напишем простой сервис, которых будет возвращать разность двух чисел. 1. Создаем класс SubtractionService.java
Можно его скомпилить - для проверки; а можно и не компилить. 2. Переименовываем его в SubtractionService.jws 3. Кладем файл в tomcat5/webapps/axis/ 4. Направляем броузер (желательно IE) на http://localhost:8080/axis/SubtractionService.jws?wsdl и видим wsdl:
Создаем клиента Куда ж веб сервис без клиента? На wsdl пускай любуется Билли; а мы напишем комманд лайн приложение. Но прежде всего нужно создать прокси для веб сервиса. Потому как без прокси работать с ним будет не очень приятное занятие. 1. Делаем прокси: $> java org.apache.axis.wsdl.WSDL2Java http://localhost:8080/axis/SubtractionService.jws?wsdl В текущей папке появится папка localhost/axis/SubtractionService_jws/ содержащая 4 файла. 2. Прокси готов, создаем клиента.
SubtractionServiceServiceLocator, SubtractionService -файлы прокси, сгенерированные WSDL2Java. Заметьте, что клиента для простоты я поместил в пакет localhost.axis.SubtractionService_jws, то есть поместить его надо в localhost/axis/SubtractionService_jws/ 3. Компилим клиента и файлы прокси: $> javac localhost/axis/SubtractionService_jws/*.java 4. Запускаем клиента.
Последнее замечание: по большому счету, для полного счастья axisу нужны также JAF и javamail. У меня он ругался пару раз вот так:
У нас аттачментов нет, потому без разницы, и так работать будет. -------------------- |
||||||||||||
|
|||||||||||||
simanyay |
|
||||||||
Антон Ковалёв Профиль Группа: Участник Сообщений: 2053 Регистрация: 22.8.2002 Репутация: 2 Всего: 36 |
Веб сервис, с помощью Burlap, на Java меньше чем за минуту:
Необходимо: 1. Любой application server (Tomcat, Resin, etc.) 2. Библиотека Burlap Делаем: // Сторона сервера 1. Создаём интерфейс:
2. Создаём сервис:
3. Деплоим сервис (в моём случае находится тут: http://localhost:8084/hello/Hello) // Сторона клиента 4. Переносим созданный в 1 интерфейс 5. Создаём клиента:
6. Компилируем, запускаем и получаем:
P.S. Burlap это базированный на XML протокол. Можно также использовать Hessian - бинарный протокол с тем же API Это сообщение отредактировал(а) simanyay - 19.5.2005, 17:07 -------------------- «It's better to be a pirate than to join the Navy» — Steve Jobs. |
||||||||
|
|||||||||
Stampede |
|
|||
Гносеолог Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: 66 Всего: 144 |
У меня по поводу веб сервисов есть один БОЛЬШОЙ-ПРЕБОЛЬШОЙ вопрос.
Дело в том, что сама идея SOAP и вызова методов как сервисов по HTTP в текстовом формате очень даже понятна, и даже можно запросто сваять демку "хелло ворлд", и вроде бы все пучком. До тех пор, пока не возникнет задача обмениваться данными, чуть более сложными чем строки и примитивы. Вот тут-то и начинается гемор. Например, если у вас есть какой-то класс, который надо пересылать в качестве параметра/результата (скажем, простой Bean), Axis создаст для него прокси, который можно будет использовать на клиенте. Но это-то будет уже не оригинальный класс! Скажете, ничего страшного? Хорошо, тогда вот реальный пример из жизни. У нас есть древнее серверное приложение на Java, написанное еще на сокетах. Я его сейчас переделываю в J2EE. Клиент к нему - толстый, на Swing'е. Для обмена данными используется паттерн Value Objects, а для доступа к серверной функциональности - Session Facade. Так вот, объекты Value Objects у меня не простые бины, а целая иерархия классов, идущая от интерфейсов и пр. - со всякими удобными методами, со своей логикой наследования и пр. Так, чтобы их было удобно обрабатывать на сервере, и отображать и манипулировать на клиенте. "And he saw that they were good" Но тут возникло требование обеспечить доступ к серверу через веб сервисы, чтобы:
И я просто сел на попу, потому что преобразование моих Value Objects в прокси сразу же ломало весь мой клиентский код. Я несколько дней рыл инет, пытаясь найти решение. В прниципе вопрос, насколько я понял, решается написанием собственных сериализаторов-десериализаторов. Но почему-то мне это решение мне не понравилось, уж не помню почему. По-моему, я очень не полюбил идею автогенерации всей этой SOAP чухни и страшный вид WDSL файла. И вот когда я в отчаянии стал рыть все подряд, я наткнулся на обсуждении разницы в подходах Java и .Net к вопросу создания веб сервисов. И оттуда я узнал, что есть две принципально разных парадигмы SOAP: document-style и RPC-style. По каким-то историческим причинам в Java получил развитие только второй, тогда как .Net последовали рекомендации консорциума по интероперабельности WS-I и выбрали document-style. И хоть я не люблю MS, но когда я узнал об этом, я готов был расцеловать Билла Гейца. После этой маленькой подсказки я просто тупо сел и за день приделал веб-сервисный интерфейс к моему серверу приложения. В Axis я объявил один единственный метод, который принимает строку и возвращает строку. Кроме того, я написал тоненький wrapper, который маршализует параметры и возвращаемые результаты. Для XML сериализации воспользовался простой до ужаса библиотечкой XStream. Потом я сделал фабрику, которая скрывает детали получения серверных Session Beans, и теперь при запуске клиента достаточно указать тип соединения, RMI или SOAP, и теперь клиенту это вообще по барабану - он просто общается с бинами (вернее с их стабами), не задумываясь, откуда они берутся. Может, конечно, я просто изобрел велосипед, но лично мне на нем ездить в четыреста пятьдесят раз удобнее И все-таки меня мучает вопрос: а может, есть более простой путь? |
|||
|
||||
simanyay |
|
|||
Антон Ковалёв Профиль Группа: Участник Сообщений: 2053 Регистрация: 22.8.2002 Репутация: 2 Всего: 36 |
Честно говоря, с такими проблемами не сталкивался, т.к. такими вещами пока не занимался. Однако же быстрая пробежка по инету выдала аналогичный, но неотвеченный вопрос на форумах Sun, а это всегда плохой знак. Хотя я нашёл вот это:
http://www.oracle.com/technology/sample_co...msws/index.html гммм... почему-то для этого УРЛа [URL] не работает Это сообщение отредактировал(а) simanyay - 19.5.2005, 22:32 -------------------- «It's better to be a pirate than to join the Navy» — Steve Jobs. |
|||
|
||||
maximb |
|
|||
Новичок Профиль Группа: Awaiting Authorisation Сообщений: 48 Регистрация: 23.5.2005 Где: Украина, г.Симфер ополь Репутация: 2 Всего: 6 |
Возможно я немного непонял в чем заключается твоя проблема. Но обмениваться сложными структурами достаточно просто, а чтобы не писать своих сериалайзеров и десереалайзеров достаточно следовать одному из ограничений аксиса - не использовать абстрактные типы (abstract, interface) т.е. в методах и объектах, которые будут использоваться ВЕБ - сервисом их не использовать. Насчет RMI + WEB-сервис: тоже все достаточно просто, т.е. достаточно правильно оформить wsdd Axis'а и легким движением EJB интерфейс превращается в WEB - сервис, ни одной строчки кода писать не требуется. Теперь клиент: (моя реализация) Клиент конектится по local EJB, если не получается то коннектится по remote EJB, если не получается конектится к WEB - сервису. Все интерфейсы EJB и WEB - сервис реализуют один интерфейс. В качестве клиентского класса выполняющего запросы к WEB-сервису используется класс реализующий интерфейс InvocationHandler - чтобы не дублировать все методы, обработка выполняется в одном небольшом методе, конструирующем запросы. Вообщем если я не понял проблему, сообщи - подумаем |
|||
|
||||
Souljah |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 148 Регистрация: 24.12.2004 Репутация: 3 Всего: 7 |
Domestic Cat - спасибо за статью, очень пригодилась
жаль плюс не могу влепить :) |
|||
|
||||
Stampede |
|
|||
Гносеолог Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: 66 Всего: 144 |
Ну я влеплю - не вопрос. Вот только скажите мне, а зачем вам веб сервисы? Дело в том, что проблема, которую я описал чуть выше в этом же топике, с использованием Axis'а не решается (или решается, но очень нетривиальным образом). В этом отношении Burlap оказывается в сорок раз проще и прозрачнее. Но он подходит только для взаимодействия Java-to-Java. Если же нужна интероперабельность, то Burlap отпадает, во всяком случае, пока для него не напишут .Net адаптер. Но прикол в том, что в случае сложных объектов и SOAP в том виде, как это делается в Axis, для интероперабельного доступа тоже не прокатывает! Именно поэтому я еще раз спрашиваю: зачем вам веб сервисы? |
|||
|
||||
Souljah |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 148 Регистрация: 24.12.2004 Репутация: 3 Всего: 7 |
вот вы даете
а чем вам не нравится идея кросплатформенных объектных интерфейсов к серверу, да еще и по хттп? а вообще -то да, кто ж без греха |
|||
|
||||
Domestic Cat |
|
|||
Эксперт Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 13 Всего: 172 |
Спасиб
-------------------- |
|||
|
||||
DounUnload |
|
|||
Unregistered |
Бросьте! Кому он нужен - этот ваш чахлый Веб сервис вместе с Ахисом в придачу.
Преимущества SOAP бесспорны, но! Для этого необходимо решить ряд проблем 1 Наконец узаконить XML Schema - тогда описания XML стандартов станут меньше 2 Отработать систему SOAP расширений на предмет совместимости с XML Schema. А то впечатление, что все бредут непонятно куда, а потом кто-то свистнет и все побежали за мячиком. Просто непонятно, зачем иной раз в проект включается та или иная библиотека поддержки. Софта много, а толку никакого, сделать что необходимо - не можешь! Вот сейчас уже Томкат 55 вышел, а чем он по существу от тройки отличается? Или, с другой стороны - а много ли интернет браузеров поддерживают XML, XML Schema, трансформацию XML? Mozila - да, но большинство как пользовались IE 5.5 так и сидят под ним. |
|||
|
||||
Souljah |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 148 Регистрация: 24.12.2004 Репутация: 3 Всего: 7 |
Веб-сервисы пишуться не для браузеров :)
софта много, но вам принимать решение, когда его использоать. я не вижу повода для недовольства, почему ws - эт плохо? ряд задач успешно решаются. я видел тяжелые проекты с API по http протоколу, в которых успешно мог быть применен ws. согласен, что ряд задач не решается с помощью axis ws, но то же самое можно сказать о любой библиотеке :) |
|||
|
||||
DUnload |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 13.7.2005 Репутация: 0 Всего: 0 |
Речь только шла о конкретном примере, чт касается WS как проблемы в целом - то я этим занимаюсь с 2002 года.
Очень неплохая книга вышла Java SOAP для профессионалов, автор Генри Бекет ISBN 5-85582-223-0 издат. Лори 2004 год Это сообщение отредактировал(а) DUnload - 14.7.2005, 06:01 |
|||
|
||||
Се ля ви |
|
||||||
Java/SOAрхитектор Профиль Группа: Модератор Сообщений: 2016 Регистрация: 5.6.2004 Где: place without tim e and space Репутация: 3 Всего: 127 |
Не пойму, что такое.
делаю всё как Котъ описал, разве что Axis 1.2.1 и Tomcat 5.5. Всё нормально до момента:
Тут происходит нечто, выходящее из ряда вон - Tomcat требует авторизоваться и посылает сообщение "XDB". Я копался в аксисе - никаких паролей в конфигах не обнаружил (был, правда, странный файл "users.lst", пороли и пользователи из которого, впрочем, не подошли). Не подошёл так же и админовый пароль от самого томката, который я задавал при установке. Но затыкается и выдаёт ошибку 401 при неудачной авторизации не просто адрес http://localhost:8080/axis/SubtractionService.jws?wsdl и даже не просто все, что связано с аксисом - сдыхает весь томкат и даже при его перезапуске это "XDB", непонятно чего от меня хотящее, не пропадает. Только полная перезагрузка системы позволяет снова работать с томкатом до той поры, пока я снова не попытаюсь залезть на http://localhost:8080/axis/SubtractionService.jws?wsdl - тогда всё повторяется. Попробовал пропустить эту стадию и пойти дальше, но понял, что всё бесполезно, когда не смог сделать проксю - выдаёт
Понятно - сам уже не может к сервису доступиться, так как сделает проксю? P.S. Кстати, в моей более новой комплектации вот это:
Происходит во всех 100% случаев. По-этому придётся качать и тоже класть в либу аксиса и прописывать в CLASSPATH: 1) JAF отсюда: http://java.sun.com/products/javabeans/glasgow/jaf.html 2) JavaMail отсюда: http://java.sun.com/products/javamail/downloads/index.html 3) Java XMLSecurity отсюда: http://xml.apache.org/security/download.html Это сообщение отредактировал(а) Се ля ви - 24.10.2005, 16:15 -------------------- |
||||||
|
|||||||
tux |
|
|||
Летатель Профиль Группа: Участник Клуба Сообщений: 1853 Регистрация: 10.2.2005 Где: msk.ru Репутация: 74 Всего: 132 |
Работаю сейчас над проектом, в котором серверы будут размещены в территориально распределенной сети (в перспективе очень большая территория, причем не везде сеть можем контролировать), причем программные компоненты на серверах должны между собой взаимодействовать. Возможно, что где-то будет открыт только трафик по HTTP. В таких условиях веб-сервисы мне кажутся наиболее естественным решением, обеспечивающим работу системы. |
|||
|
||||
Stampede |
|
|||
Гносеолог Профиль Группа: Участник Клуба Сообщений: 963 Регистрация: 25.4.2005 Где: Calgary, Alberta, Canada Репутация: 66 Всего: 144 |
tux
Ага, отлично! Я как раз и ждал чего-то подобного. В таком случае у меня есть одна маленькая поправка:
А я считаю, что если отталкиваться от специфики задачи, то существует еще более общий общий делитель: Java remoting over HTTP. Частными реализациями какового могут быть веб-сервисы, а могут быть и другие технологии, например Burlap/Hessian. Это сообщение отредактировал(а) Stampede - 15.9.2005, 17:59 -------------------- "If you want something done right, do it yourself" По секрету: выучить английский - реально! |
|||
|
||||
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |