forum.bitel.ru http://forum.bitel.ru/ |
|
Помогите с SOAP http://forum.bitel.ru/viewtopic.php?f=19&t=8221 |
Страница 1 из 2 |
Автор: | skyb [ 01 июл 2013, 20:10 ] |
Заголовок сообщения: | Помогите с SOAP |
С самого нуля, хотяб ссылки, есть система, с ней в обои стороны обмениваться по SOAP, как использовать скачанные WSDL и тд., хотяб ссылками |
Автор: | skyb [ 01 июл 2013, 20:11 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
да, это все с биллингом стыковать нужно |
Автор: | Amir [ 01 июл 2013, 20:40 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
jdk/bin/wsimport ./MngFacadeAPI.WSDL -s src -p api.ru.televox.bgbilling...mng jdk/bin/wsimport ./Mng2FacadeAPI.WSDL -s src -p api.ru.televox.bgbilling...mng2 Результат из папки src (которую предварительно нужно создать) положить в BGBilling/dyn. Предположим, первая wsdl - это удаленый сервис, чтобы с ним работать, нужно сделать так: Код: MngFacadeAPI mngFacadeAPI = new MngFacadeAPIService( new URL( "http://host:port/application/api/MngFacadeAPI?wsdl" ) ).getMngFacadeAPIPort(); Map<String, Object> requestContext = ((BindingProvider)mngFacadeAPI).getRequestContext(); requestContext.put( BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://host:port/application/api/MngFacadeAPI" ); Второй нужно реализовать на BGBilling - в пакете (папке) api.ru.televox.bgbilling...mng2 нужно создать пакет (папку) impl, в нем создать класс Mng2FacadeAPIImpl.java и реализовать в нем методы из Mng2FacadeAPI Код: @WebService(endpointInterface = "ru.televox.bgbilling...mng2.Mng2FacadeAPI") В результате web-сервис должен стать доступен по адресу http://bgb:8080/bgbilling/api/ru.televo ... deAPI?wsdl
public class Mng2FacadeAPIImpl extends AbstractService implements Mng2FacadeAPI { } |
Автор: | skyb [ 02 июл 2013, 06:05 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
По удаленному сервису, получилось у меня InventorySoap.wsdl положил я его /usr/local/BGBillingServer/dyn сюда, пытаюсь импортировать Код: package ru.skyb.scripts.behavior; import ru.bitel.bgbilling.kernel.event.Event; import ru.bitel.bgbilling.kernel.script.server.dev.EventScriptBase; import ru.bitel.bgbilling.server.util.Setup; import ru.bitel.common.sql.ConnectionSet; import inventory.Address; import inventory.ArrayOfAvailabilityRequest; import inventory.AvailabilityInfo; import inventory.AvailabilityRequest; import inventory.InventorySoap; import inventory.InventorySoapSoap; import java.net.URL; import javax.xml.namespace.QName; public class Astlu extends EventScriptBase { @Override public void onEvent( Event event1, Setup setup2, ConnectionSet connectionSet3 ) throws Exception { } } Ругается на импорт Код: import inventory.Address;
import inventory.ArrayOfAvailabilityRequest; import inventory.AvailabilityInfo; import inventory.AvailabilityRequest; import inventory.InventorySoap; import inventory.InventorySoapSoap; |
Автор: | Amir [ 02 июл 2013, 14:35 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
Нажимаете "скомпилировать все"? |
Автор: | skyb [ 02 июл 2013, 15:08 ] | ||
Заголовок сообщения: | Re: Помогите с SOAP | ||
да, нажимал, вот что в выводе
|
Автор: | snark [ 02 июл 2013, 15:15 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
Класс, на который ссылаешься, подкладывать надо же. |
Автор: | skyb [ 02 июл 2013, 15:16 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
куда подкладывать? |
Автор: | Amir [ 02 июл 2013, 15:17 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
После генерации через wsimport должны были сгенерироваться классы, судя по всему в папке inventory - эту папку со всеми классами - в dyn. |
Автор: | skyb [ 02 июл 2013, 16:35 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
неа, нужно папку classes запихать сюда /usr/local/BGBillingServer/classes о как |
Автор: | skyb [ 08 июл 2013, 08:12 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
Amir писал(а): jdk/bin/wsimport ./MngFacadeAPI.WSDL -s src -p api.ru.televox.bgbilling...mng jdk/bin/wsimport ./Mng2FacadeAPI.WSDL -s src -p api.ru.televox.bgbilling...mng2 Результат из папки src (которую предварительно нужно создать) положить в BGBilling/dyn. Предположим, первая wsdl - это удаленый сервис, чтобы с ним работать, нужно сделать так: Код: MngFacadeAPI mngFacadeAPI = new MngFacadeAPIService( new URL( "http://host:port/application/api/MngFacadeAPI?wsdl" ) ).getMngFacadeAPIPort(); Map<String, Object> requestContext = ((BindingProvider)mngFacadeAPI).getRequestContext(); requestContext.put( BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "http://host:port/application/api/MngFacadeAPI" ); Второй нужно реализовать на BGBilling - в пакете (папке) api.ru.televox.bgbilling...mng2 нужно создать пакет (папку) impl, в нем создать класс Mng2FacadeAPIImpl.java и реализовать в нем методы из Mng2FacadeAPI Код: @WebService(endpointInterface = "ru.televox.bgbilling...mng2.Mng2FacadeAPI") В результате web-сервис должен стать доступен по адресу http://bgb:8080/bgbilling/api/ru.televo ... deAPI?wsdlpublic class Mng2FacadeAPIImpl extends AbstractService implements Mng2FacadeAPI { } По первому вроде понял, а вот по второму не особо, можно рабочий класс скинуть? |
Автор: | skyb [ 08 июл 2013, 14:59 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
http://bgbill.net:8080/bgbilling/api/ru ... /Zoho?wsdl ссылка, скрипт Код: package api.ru.skyb.bgbilling.service.impl; import java.sql.Connection; import java.util.Date; import javax.jws.WebService; import ru.bitel.bgbilling.kernel.container.service.server.AbstractService; import ru.bitel.bgbilling.common.BGException; import ru.bitel.bgbilling.kernel.container.managed.ServerContext; import ru.bitel.bgbilling.kernel.tariff.option.common.service.TariffOptionService; import ru.bitel.bgbilling.kernel.tariff.option.server.bean.ContractTariffOptionDao; import ru.bitel.bgbilling.kernel.tariff.option.common.bean.ContractTariffOption; import java.text.SimpleDateFormat; @WebService(endpointInterface = "api.ru.skyb.bgbilling.service.impl.ZohoImpl") public class ZohoImpl extends AbstractService { } но при переходе по ссылке Код: HTTP Status 500 - type Status report message description The server encountered an internal error () that prevented it from fulfilling this request. что не так? |
Автор: | Amir [ 08 июл 2013, 15:34 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
Нужно в логах сервера ошибки смотреть. Если просто свой сервис (а не реализация чужого интерфейса), то попробуйте: Код: @WebService()
public class ZohoImpl extends AbstractService { public String test() { return "Hello world!"; } } |
Автор: | skyb [ 08 июл 2013, 15:38 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
07-08/09:38:10 ERROR [bitel.billing.server.admin.action.ActionCommand] LoggingPrintStream - com.sun.xml.ws.model.RuntimeModelerException: A @WebService.targetNamespace must be specified on classes with no package. Class: api.ru.skyb.bgbilling.service.impl.ZohoImpl |
Автор: | Amir [ 08 июл 2013, 15:40 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
Код: @WebService(targetNamespace = "http://billing.skyb.ru") или, например: public class ZohoImpl extends AbstractService { public String test() { return "Hello world!"; } } Код: @WebService(targetNamespace = "urn:billing-zoho")
|
Автор: | skyb [ 08 июл 2013, 15:46 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
Да, помогло, а из чего исходить выбирая эту переменную? |
Автор: | skyb [ 08 июл 2013, 16:50 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
а есть пример создания договора по шаблону? Код: package api.ru.skyb.bgbilling.service.impl;
import java.sql.Connection; import java.util.Date; import javax.jws.WebService; import ru.bitel.bgbilling.kernel.container.service.server.AbstractService; import ru.bitel.bgbilling.common.BGException; import ru.bitel.bgbilling.kernel.container.managed.ServerContext; import ru.bitel.bgbilling.kernel.tariff.option.common.service.TariffOptionService; import ru.bitel.bgbilling.kernel.tariff.option.server.bean.ContractTariffOptionDao; import ru.bitel.bgbilling.kernel.tariff.option.common.bean.ContractTariffOption; import java.text.SimpleDateFormat; import ru.bitel.bgbilling.kernel.script.server.dev.GlobalScriptBase; import ru.bitel.bgbilling.server.util.Setup; import ru.bitel.common.sql.ConnectionSet; import java.sql.*; import java.util.*; import java.util.Date; import bitel.billing.server.contract.bean.ContractManager; import bitel.billing.common.TimeUtils; import bitel.billing.server.contract.bean.*; @WebService(targetNamespace = "urn:billing-zoho") public class ZohoImpl extends AbstractService { public Contract createFromPattern(int pattern_id, java.lang.String title, java.util.Calendar date, java.lang.String pswd) { //Не подскажите что сюда вставить чтоб по шаблону создался договор????? } |
Автор: | Amir [ 08 июл 2013, 16:59 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
http://bgbilling.ru/v6.0/javadoc/bitel/billing/server/contract/bean/ContractManager.html#createFromPattern(int, java.lang.String, java.util.Calendar, java.lang.String, java.util.Map, boolean, int, int, java.lang.String, int, java.util.Map) Код: ContractManager contractManager = new ContractManager( context.getConnection() );
Contract contract = contractManager.createFromPattern( card.getPatternId(), null, new GregorianCalendar(), card.getCardPinCode(), new HashMap<String, Object>(), true, 0, 0, null, User.USER_SERVER, params ); |
Автор: | skyb [ 08 июл 2013, 17:14 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
нене, мне же нужно передать эти параметры со стороннего приложения |
Автор: | Amir [ 08 июл 2013, 17:18 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
Код: Contract contract = contractManager.createFromPattern( pattern_id, null, date, pswd, new HashMap<String, Object>(), true, 0, 0, title, User.USER_SERVER, params );
|
Автор: | skyb [ 15 июл 2013, 19:30 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
А ещё вопрос, урл должен обязательно быть с ?wsdl чтоб увидеть там реализованные методы? |
Автор: | skyb [ 16 июл 2013, 06:56 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
разобрался |
Автор: | skyb [ 09 авг 2013, 15:38 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
а какой soap используется в биллинге? SoapRpc или SoapDocument |
Автор: | arengin [ 11 сен 2013, 23:24 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
Надеюсь не против если я здесь пофлужу чутка) В общем целом то же самое нужно реализовать, скомпилил без ошибок вышеприведенный код (порадовался, забавно скомпилить то не знаю что...) В итоге понял что не в курсе что есть soap... Разобрался более менее, представил. Понял что втянуться быстро не получится, решил начать с простого взял имеющийся пример http://wiki.bitel.ru/index.php/PHP_soapClient Более менее разобрал что к чему, в итоге не могу понять каким образом передать несколько переменных в функцию через soap.. php скрипт Код: $wsdl = "http://192.168.0.1:8080/bgbilling/api/ru.customservice.bgbilling.service/SomeService?wsdl"; $client = new SoapClient($wsdl); $answer = $client->getSomeData('Aleks', 'Timur'); var_dump ($answer); $cid=$answer->return->cid; echo "Output: $cid\n"; Ну и динамический код в bgbilling'е Код: package api.ru.customservice.bgbilling.service.impl; import javax.jws.WebService; import api.ru.customservice.bgbilling.bean.SomeData; import ru.bitel.bgbilling.kernel.container.service.server.AbstractService; @WebService(targetNamespace = "customservice") public class SomeServiceImpl extends AbstractService{ /** * @param a * @soap * @return */ public SomeData getSomeData( String a, String b ) { a = "Hello " + a + " " + b; SomeData someData = new SomeData(); someData.setCid( a ); return someData; } } Все что удалось получить в ответ: Код: object(stdClass)#2 (1) { ["return"]=> object(stdClass)#3 (1) { ["cid"]=> string(15) "Hello null null" } } Output: Hello null null Во всех мануалах аргументы функции передаются в виде одномерного массива(мне как бы больше и не требуется), но как бы я не пробовал, мне не удается заставить вывести переменные. Хоть как в моем варианте, хоть так: Код: client->__soapCall("getSomeData", array('Aleks', 'Timur')); хоть как в примере(чего я какраз до сих пор не могу понять - почему вложенный массив в массив) Код: client->__soapCall("getSomeData", array(array('Aleks', 'Timur'))); И через массив попробовал менял получение аргумента в виде массива Код: public SomeData getSomeData( String[] a ) чем черт не шутит, но что то не поддается ни с какого угла мне эта функция. В чем я не прав? |
Автор: | skn [ 11 сен 2013, 23:51 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
на вики Цитата: $answer = $client->__SoapCall("getSomeData", array( array ( 'arg0' => 'Aleks0', 'arg1' => 'Aleks1' ) ) ); по моему ваш вариант отличается... |
Автор: | arengin [ 12 сен 2013, 00:02 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
skn писал(а): на вики Цитата: $answer = $client->__SoapCall("getSomeData", array( array ( 'arg0' => 'Aleks0', 'arg1' => 'Aleks1' ) ) ); по моему ваш вариант отличается... Да вроде тоже пробовал, мы получаем первую переменную, но, вторую не удается получить. Просто если я совсем все вариации запишу которые появлялись у меня в голове - это будет смешно) Код: object(stdClass)#2 (1) { ["return"]=> object(stdClass)#3 (1) { ["cid"]=> string(17) "Hello Aleks0 null" } } Output: Hello Aleks0 null
|
Автор: | skn [ 12 сен 2013, 01:03 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
а если так Код: public SomeData getSomeData( String a, String b ) меняем на Код: public SomeData getSomeData( @WebParam( name = "a" ) String a, @WebParam( name = "b" ) String b ) и вызывать Код: $answer = $client->__SoapCall("getSomeData", array( "getSomeData" => array ( 'a' => 'Aleks0', 'b' => 'Aleks1', ) ) );
|
Автор: | arengin [ 12 сен 2013, 01:19 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
Вот кстати еще примерчик с массивом, тут error на выходе не понятной для меня консистенции. биллинг Код: package api.ru.customservice.bgbilling.service.impl; import javax.jws.WebService; import api.ru.customservice.bgbilling.bean.SomeData; import ru.bitel.bgbilling.kernel.container.service.server.AbstractService; @WebService(targetNamespace = "customservice") public class SomeServiceImpl extends AbstractService{ /** * @param a * @soap * @return */ public SomeData getSomeData( String[] a ) { String b = "Hello " + a[0] + " " + a[1]; SomeData someData = new SomeData(); someData.setCid( b ); return someData; } } php скрипт Код: $wsdl = "http://192.168.0.1:8080/bgbilling/api/ru.customservice.bgbilling.service/SomeService?wsdl"; $client = new SoapClient($wsdl); $answer = $client->__SoapCall("getSomeData", array( array ( 'arg0' => 'Aleks0', 'arg1' => 'Aleks1' ) ) ); var_dump ($answer); $cid=$answer->return->cid; echo "Output: $cid\n"; Ошибка: Код: Fatal error: Uncaught SoapFault exception: [S:Server] 1 in /путь до скрипта/soap.php:16 Stack trace: #0 /путь до скрипта/soap.php(16): SoapClient->__soapCall('getSomeData', Array) #1 {main} thrown in /путь до скрипта/soap.php on line 16 16я строчка в коде Код: $answer = $client->__SoapCall("getSomeData", array( array ( 'arg0' => 'Aleks0', 'arg1' => 'Aleks1' ) ) ); SoapFault: Код: object(SoapFault)#5 (10) { ["message":protected]=> string(1) "1" ["string":"Exception":private]=> string(0) "" ["code":protected]=> int(0) ["file":protected]=> string(46) "/путь до скрипта/soap.php" ["line":protected]=> int(16) ["trace":"Exception":private]=> array(1) { [0]=> array(6) { ["file"]=> string(46) "/путь до скрипта/soap.php" ["line"]=> int(16) ["function"]=> string(10) "__soapCall" ["class"]=> string(10) "SoapClient" ["type"]=> string(2) "->" ["args"]=> array(2) { [0]=> string(11) "getSomeData" [1]=> array(1) { [0]=> array(2) { ["arg0"]=> string(6) "Aleks0" ["arg1"]=> string(6) "Aleks1" } } } } } ["previous":"Exception":private]=> NULL ["faultstring"]=> string(1) "1" ["faultcode"]=> string(8) "S:Server" ["detail"]=> object(stdClass)#2 (1) { ["exception"]=> object(stdClass)#3 (2) { ["message"]=> string(1) "1" ["stackTrace"]=> object(stdClass)#4 (1) { ["frame"]=> array(43) { [0]=> string(0) "" [1]=> string(0) "" [2]=> string(0) "" [3]=> string(0) "" [4]=> string(0) "" [5]=> string(0) "" [6]=> string(0) "" [7]=> string(0) "" [8]=> string(0) "" [9]=> string(0) "" [10]=> string(0) "" [11]=> string(0) "" [12]=> string(0) "" [13]=> string(0) "" [14]=> string(0) "" [15]=> string(0) "" [16]=> string(0) "" [17]=> string(0) "" [18]=> string(0) "" [19]=> string(0) "" [20]=> string(0) "" [21]=> string(0) "" [22]=> string(0) "" [23]=> string(0) "" [24]=> string(0) "" [25]=> string(0) "" [26]=> string(0) "" [27]=> string(0) "" [28]=> string(0) "" [29]=> string(0) "" [30]=> string(0) "" [31]=> string(0) "" [32]=> string(0) "" [33]=> string(0) "" [34]=> string(0) "" [35]=> string(0) "" [36]=> string(0) "" [37]=> string(0) "" [38]=> string(0) "" [39]=> string(0) "" [40]=> string(0) "" [41]=> string(0) "" [42]=> string(0) "" } } } } } По предложенному вами варианту, сделал как сказали: биллинг Код: package api.ru.customservice.bgbilling.service.impl; import javax.jws.WebParam; import javax.jws.WebService; import api.ru.customservice.bgbilling.bean.SomeData; import ru.bitel.bgbilling.kernel.container.service.server.AbstractService; @WebService(targetNamespace = "customservice") public class SomeServiceImpl extends AbstractService{ /** * @param a * @soap * @return */ public SomeData getSomeData( @WebParam( name = "a" ) String a, @WebParam( name = "b" ) String b ) { String c = "Hello " + a + " " + b; SomeData someData = new SomeData(); someData.setCid( c ); return someData; } } php скрипт Код: $wsdl = "http://192.168.0.1:8080/bgbilling/api/ru.customservice.bgbilling.service/SomeService?wsdl"; $client = new SoapClient($wsdl); $answer = $client->__SoapCall("getSomeData", array( "getSomeData" => array ( 'a' => 'Aleks0', 'b' => 'Aleks1', ) ) ); var_dump ($answer); $cid=$answer->return->cid; echo "Output: $cid\n"; Получаемс: Код: object(stdClass)#2 (1) { ["return"]=> object(stdClass)#3 (1) { ["cid"]=> string(15) "Hello null null" } } Output: Hello null null Бьюсь уже об эту вроде как легкую задачку со вчерашнего вечера и уже готов плакать и смеяться одновременно) |
Автор: | skn [ 12 сен 2013, 04:12 ] |
Заголовок сообщения: | Re: Помогите с SOAP |
1) см. php.ini Код: [soap] ; Enables or disables WSDL caching feature. ; http://php.net/soap.wsdl-cache-enabled soap.wsdl_cache_enabled=1 ; Sets the directory name where SOAP extension will put cache files. ; http://php.net/soap.wsdl-cache-dir soap.wsdl_cache_dir="/tmp" ; (time to live) Sets the number of second while cached file will be used ; instead of original one. ; http://php.net/soap.wsdl-cache-ttl soap.wsdl_cache_ttl=86400 ; Sets the size of the cache limit. (Max. number of WSDL files to cache) soap.wsdl_cache_limit = 5 на время отладки отключить кеширование (первый параметр) и почистить кеш (каталог указан во втором параметре) для метода Код: public SomeData getSomeData( String a, String b ) параметры будут называться arg0 и arg1 если написать так Код: public SomeData getSomeData( @WebParam( name = "aa" ) String aa, String bb ) параметры будут называться aa и arg1 узнать как называются параметры можно открыв wsdl в браузере, найти в ней параметр schemaLocation= и перейти по указаному в параметре адресу Код: $client = new SoapClient($wsdl, array( 'trace' => true ) );
#var_dump($client->__getFunctions()); $params = array('arg0'=>"Aleks0",'arg1'=>"Aleks1"); $answer = $client->getSomeData( $params ); echo "REQUEST:\n" . $client->__getLastRequest() . "\n"; #var_dump ($answer); #print_r($answer); $cid = $answer->return->cid; echo "Output: $cid\n" |
Страница 1 из 2 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |