forum.bitel.ru http://forum.bitel.ru/ |
|
[решено] Web-сервисы и json [6.2.872] http://forum.bitel.ru/viewtopic.php?f=19&t=10554 |
Страница 1 из 1 |
Автор: | TrUsTeR [ 26 май 2015, 13:38 ] |
Заголовок сообщения: | [решено] Web-сервисы и json [6.2.872] |
Перевожу внешний скрипт с экшнов на web-сервисы. В модуле Inet при добавлении (редактировании) сервиса случился затык. Все параметры для составления JSON-запроса получил из дебаг-лога биллинга и добавив нужный сервис. Обращаюсь к серверу так: Код: http://bgbilling:8080/bgbilling/executer/json/ru.bitel.bgbilling.modules.inet.api/12/InetServService Отправляю данные: Код: {"method" : "inetServUpdate", "user" :{ "user" : "bguser", "pswd" : "bgpass" }, "params" : { "inetServ" : { "accessCode": 0, "addrFrom": "CgEEkw==", "addrTo":"CgEEkw==", "cid": "50000", "coid":"0", "dateFrom": "2015-05-26T00:00:00+12:00", "devState": "0", "deviceTitle":"Папка: PPPoE", "did": "2", "id": "0", "ifaceId": "-1", "ipResId":"0", "ipResSubsriptionId": "0", "parentId":"0", "passw":"clientpswd", "scid":"0", "sessCntLimit":"1", "status":"0", "typeId":"1", "uname":"clientlogin", "vlan":"-1", "comment": "", "config": "", "identifierList": [], "macList": "" }, "generateLogin":"false", "generatePassword":"false", "saWaitTimeout":"0" } } В ответе получаю: Код: { "status": "error", "exception": "java.lang.NullPointerException", "message": null, "data": {} } В логе сервера: Цитата: java.lang.reflect.InvocationTargetException at sun.reflect.GeneratedMethodAccessor161.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at ru.bitel.bgbilling.kernel.container.service.server.ServiceInfo.invoke(ServiceInfo.java:101) at ru.bitel.bgbilling.kernel.container.ws.server.JsonWsHandler.handle(JsonWsHandler.java:255) at bitel.billing.server.Executer.doPost(SourceFile:158) at javax.servlet.http.HttpServlet.service(HttpServlet.java:646) at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1074) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745) Caused by: java.lang.NullPointerException at ru.bitel.bgbilling.modules.inet.api.server.service.InetServServiceImpl.checkLoginSymbols(InetServServiceImpl.java:784) at ru.bitel.bgbilling.modules.inet.api.server.service.InetServServiceImpl.setAndCheckLoginPassword(InetServServiceImpl.java:340) at ru.bitel.bgbilling.modules.inet.api.server.service.InetServServiceImpl.inetServUpdateInternal(InetServServiceImpl.java:256) at ru.bitel.bgbilling.modules.inet.api.server.service.InetServServiceImpl.inetServUpdate(InetServServiceImpl.java:233) ... 25 more Куда копать? Как исправить? |
Автор: | stark [ 26 май 2015, 13:46 ] |
Заголовок сообщения: | Re: Web-сервисы и json [6.2.872] |
поле логин надо заполнить пустой строкой. Хотя это надо исправить. |
Автор: | TrUsTeR [ 26 май 2015, 14:01 ] |
Заголовок сообщения: | Re: Web-сервисы и json [6.2.872] |
Спасибо! Т.е. параметры в логе биллинга и для web-сервисов через json отличаются? В запросе выше добавил (с пустой строкой биллинг не захотел, отвечал такой логин уже есть) Код: "login":"clientlogin" теперь хоть биллинг понятные ошибки выдает - пишет, что якобы пароль не указан, хотя поле passw указано. Подбором получилось указать пароль так, не знаю верно ли: Код: "password":"clientpswd" теперь пишет "Не указан IP адрес", хотя опять же - параметры addrFrom и addrTo забиты. Что я делаю не так? Или где можно глянуть тогда актуальные параметры? |
Автор: | TrUsTeR [ 27 май 2015, 11:16 ] |
Заголовок сообщения: | Re: Web-сервисы и json [6.2.872] |
Добавил в параметры выше следующее: Код: "login":"clientlogin", "password":"clientpswd", "addressFrom":"CgEEkw==", "addressTo":"CgEEkw==" Теперь опять NullPointerException. В логе сервера: Цитата: Caused by: ru.bitel.bgbilling.common.BGException: java.lang.NullPointerException at ru.bitel.bgbilling.modules.inet.api.server.bean.InetServOptionDao.update(InetServOptionDao.java:70) at ru.bitel.bgbilling.modules.inet.api.server.service.InetServServiceImpl.inetServUpdateInternal(InetServServiceImpl.java:289) at ru.bitel.bgbilling.modules.inet.api.server.service.InetServServiceImpl.inetServUpdate(InetServServiceImpl.java:233) ... 25 more Caused by: java.lang.NullPointerException at ru.bitel.bgbilling.modules.inet.api.server.bean.InetServOptionDao.update(InetServOptionDao.java:57) ... 27 more Может есть рабочий пример, как добавить сервис в модуль inet через json? |
Автор: | dimOn [ 27 май 2015, 11:51 ] |
Заголовок сообщения: | Re: Web-сервисы и json [6.2.872] |
переданный список из InetServOption является null |
Автор: | TrUsTeR [ 28 май 2015, 12:43 ] |
Заголовок сообщения: | Re: Web-сервисы и json [6.2.872] |
Непонятно только почему он null, если фича документирована, все параметры переданы. А оно вместо айди созданного сервиса возвращает исключение. Если это толком не работает, то зачем нужно было убирать http-экшны? |
Автор: | stark [ 28 май 2015, 12:49 ] |
Заголовок сообщения: | Re: Web-сервисы и json [6.2.872] |
TrUsTeR писал(а): Непонятно только почему он null, если фича документирована, все параметры переданы. А оно вместо айди созданного сервиса возвращает исключение. Если это толком не работает, то зачем нужно было убирать http-экшны? вот тут же описано что есть параметр optionList. В том запросе, который вы написали выше, его нет. Покажите что вы сейчас отправляете . |
Автор: | Amir [ 28 май 2015, 13:08 ] |
Заголовок сообщения: | Re: Web-сервисы и json [6.2.872] |
Цитата: Если это толком не работает, то зачем нужно было убирать http-экшны? Для модуля Inet их и не было, сразу делали через web-сервисы. Работает, клиент биллинга общается с сервером через эти же web-сервисы. Возможность работать c этими же сервисами через JSON прикрутили как дополнительную. Как вариант, Вы можете посмотреть что передается при сохранении сервиса через клиент биллинга и на основе этого сделать запрос через JSON.Попробуйте добавить optionList: Код: {"method" : "inetServUpdate", "user" :{ "user" : "bguser", "pswd" : "bgpass" }, "params" : { "inetServ" : { "accessCode": 0, "addrFrom": "CgEEkw==", "addrTo":"CgEEkw==", "cid": "50000", "coid":"0", "dateFrom": "2015-05-26T00:00:00+12:00", "devState": "0", "deviceTitle":"Папка: PPPoE", "did": "2", "id": "0", "ifaceId": "-1", "ipResId":"0", "ipResSubsriptionId": "0", "parentId":"0", "passw":"clientpswd", "scid":"0", "sessCntLimit":"1", "status":"0", "typeId":"1", "uname":"clientlogin", "vlan":"-1", "comment": "", "config": "", "identifierList": [], "macList": "", "login":"clientlogin", "password":"clientpswd" }, "optionList": [], "generateLogin":"false", "generatePassword":"false", "saWaitTimeout":"0" } } http-экшн бы точно также ругался "Ошибка параметров запроса" или "Ошибка сервера". Поэтому в обоих случаях стоит смотреть, что отправляет клиент биллинга. Веб-сервисы удобней чем http-экшены, если не пытаться делать http-запрос самому, а использовать один из многочисленных клиентов, например, как здесь: http://wiki.bitel.ru/index.php/PHP_soapClient |
Автор: | TrUsTeR [ 29 май 2015, 13:19 ] |
Заголовок сообщения: | Re: Web-сервисы и json [6.2.872] |
Amir писал(а): Возможность работать c этими же сервисами через JSON прикрутили как дополнительную. Как вариант, Вы можете посмотреть что передается при сохранении сервиса через клиент биллинга и на основе этого сделать запрос через JSON. Значит реализация сервисов через JSON сделана иначе. Я выше привел пример, когда клиент биллинга, общаясь через soap xml при создании сервиса задаёт пароль через параметр "passw" - при обращении к сервису через json этот параметр не подхватывается, пишет Цитата: {"status":"error","exception":"ru.bitel.bgbilling.common.BGMessageException","message":"Минимальная длина пароля 1 символов.","data":{}} Опытным путём подобрал, что пароль задается посредством json через параметр "password". По крайней мере тогда ошибка не появляется, что пароль слишком короткий, а появляется следующая, что ip-адрес не указан... Т.е. посмотреть что передается при сохранении сервиса через клиент биллинга и потом это использовать, как рекомендуете вы - не получится. В этом то и основная проблема, неизвестно какие параметры под какими именами в json rpc. Изначально я полагал, что они не будут отличаться от тех, что передает клиент биллинга. А что касательно того, что не надо делать запрос самому, а отправлять через soapClient: запросы, отправляемые через JSON посредством плагина браузера проще и быстрее править на этапе отладки. |
Автор: | stark [ 29 май 2015, 13:35 ] |
Заголовок сообщения: | Re: Web-сервисы и json [6.2.872] |
TrUsTeR писал(а): Amir писал(а): Возможность работать c этими же сервисами через JSON прикрутили как дополнительную. Как вариант, Вы можете посмотреть что передается при сохранении сервиса через клиент биллинга и на основе этого сделать запрос через JSON. Значит реализация сервисов через JSON сделана иначе. Я выше привел пример, когда клиент биллинга, общаясь через soap xml при создании сервиса задаёт пароль через параметр "passw" - при обращении к сервису через json этот параметр не подхватывается, пишет Цитата: {"status":"error","exception":"ru.bitel.bgbilling.common.BGMessageException","message":"Минимальная длина пароля 1 символов.","data":{}} Опытным путём подобрал, что пароль задается посредством json через параметр "password". По крайней мере тогда ошибка не появляется, что пароль слишком короткий, а появляется следующая, что ip-адрес не указан... Странно, давайте разберемся с этим вопросом .. Вообще , если смотреть тут, то там Код: java.lang.String getPassword() Код: byte[] getAddressFrom() Код: byte[] getAddressTo() Но у нас в коде они указаны так Код: @XmlAttribute(name = "passw") public String getPassword() { return password; } Код: @XmlAttribute(name = "addrFrom") public byte[] getAddressFrom() { return addressFrom; } Код: @XmlAttribute(name = "addrTo") public byte[] getAddressTo() { return addressTo; } Попробуйте найти соответствующий объект в нашем javadoc, у него взять у него метод "getSomething" и использовать "something"( c маленькой быквы). Мы указываем короткие имена для клиента типа "passw", видимо для json они не применяются. Возможно мы сможем это исправить, а пока попробуйте искать имена по нашему javadoc. |
Автор: | TrUsTeR [ 29 май 2015, 14:01 ] |
Заголовок сообщения: | Re: Web-сервисы и json [6.2.872] |
Ура! Большое спасибо, stark! Воспользовался javadoc, и далеко идти по нему не пришлось. Заменил "cid" на "contractId" (заметил кстати, что в базе тоже много где стали использовать именование contractId) и сработало. Но нервов оно потрепало. Хорошо бы в документации в 8.3 подправить, что имена параметров нужно смотреть в javadoc. Ибо в подобном случае я всегда руководствуюсь мануалом. Привожу запрос с минимальным набором параметров (ибо другие ещё не проверил на верное именование), с которым можно создать сервис в модуле Inet: Код: {"method" : "inetServUpdate",
"user" :{ "user" : "bguser", "pswd" : "bgpass" }, "params" : { "inetServ" : { "addressFrom": "CgEEkw==", "addressTo":"CgEEkw==", "contractId": "50000", "dateFrom": "2015-05-29T00:00:00+12:00", "typeId":"1", "login":"clientlogin", "password":"clientpswd" }, "optionList": [], "generateLogin":false, "generatePassword":false, "saWaitTimeout":0 } } |
Автор: | stark [ 29 май 2015, 14:50 ] |
Заголовок сообщения: | Re: Web-сервисы и json [6.2.872] |
TrUsTeR писал(а): " (заметил кстати, что в базе тоже много где стали использовать именование contractId) и сработало. Но нервов оно потрепало. Хорошо бы в документации в 8.3 подправить, что имена параметров нужно смотреть в javadoc. Ибо в подобном случае я всегда руководствуюсь мануалом. Ну там есть общая фраза про это. Цитата: Для работы с сервисом необходимо найти его класс в JavaDoc, например: ContractService. Далее определить имена и типы передаваемых параметров, переходя к JavaDoc описаниям других классов, если понадобится. Т.е. для определения параметров нужно использовать javadoc, а не лог клиента. Написал дополнительное примечание вот тут . |
Автор: | TrUsTeR [ 01 июн 2015, 22:24 ] |
Заголовок сообщения: | Re: [решено] Web-сервисы и json [6.2.872] |
Кстати, в каком формате передается ip-адрес вебсервисом? Цитата: "addressTo":"CgEEkw==" Не глядя казалось, что в хэксе, как и в бд, а когда начал нужные параметры в текст переводить, то непонятно как. ![]() |
Автор: | Amir [ 01 июн 2015, 22:32 ] |
Заголовок сообщения: | Re: [решено] Web-сервисы и json [6.2.872] |
Base64 вроде бы. Там байтовый массив byte[4], веб-сервисы их в Base64 кодируют. |
Автор: | TrUsTeR [ 02 июн 2015, 00:15 ] |
Заголовок сообщения: | Re: [решено] Web-сервисы и json [6.2.872] |
Да, спасибо. Первым делом подумал про base64, но ввело в заблуждение то, что закодированная строка слишком короткая для текстового параметра. А с массивом байт всё сходится: расшифровкой CgEEkw== будет 0a010001 |
Страница 1 из 1 | Часовой пояс: UTC + 5 часов [ Летнее время ] |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |