SOAP HRESULT=0x80020005 Несовпадение типов | |
---|---|
vic119 Сообщений: 3 Дата регистрации: 10.12.2014 |
Пытаюсь реализовать проверку контрагента через веб сервис на сайте налоговой службы (http://npchk.nalog.ru/)
При вызове метода проверки получаю ошибку Client: Type conversion failure for element NdsRequest HRESULT=0x80020005 Несовпадение типов. Пожалуйста, намекните в чём может быть проблема? *-------------------------------------------- CLEAR ALL SET TALK OFF CLEAR local loSoapClient,; loXMLDoc As MSXML2.DOMDocument,; loXMLNodes As MSXML2.IXMLDOMNodeList,; loResult As MSXML2.IXMLDOMNodeList * создаем объект на основе SOAP 3.0 loSoapClient=CREATEOBJECT("MSSoap.SoapClient30") * URL Web Service loSoapClient.MSSoapInit("http://npchk.nalog.ru/FNSNDSCAWS?wsdl", "FNSNDSCAWS", "FNSNDSCAWS_Port") * Веб служба реализует метод NdsRequest() возвращает XMLDOMNodeList * принимает параметр типа XMLDOMNodeList * XSD-схема запроса сведений: * npchk.nalog.ru * Создаём объект DOMDocument loXMLDoc = CreateObject("MSXML2.DOMDocument") loXMLDoc.async= .F. * Загружаем XML в DOMDocument if !loXMLDoc.LoadXML('<?xml version="1.0" encoding="windows-1251"?><NdsRequest><NP>INN="6441012385" KPP="583601001" DT="08.12.2014"</NP></NdsRequest>') ?loXMLDoc.parseError.errorCode ,loXMLDoc.parseError.reason return ENDIF * Получаем объект на основе IXMLDOMNodeList, включающий все элементы loXMLNodes = loXMLDoc.getElementsByTagName('*') && msdn.microsoft.com * Вызываем метод NdsRequest TRY loResult = loSoapClient.NdsRequest(loXMLNodes) CATCH TO loexception ? loexception.MESSAGE ? loexception.ERRORNO ? loexception.details ENDTRY |
Re: SOAP HRESULT=0x80020005 Несовпадение типов | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
В использовании данным сервисом UDT (User Defined Types). Фокс через SOAP Toolkit более-менее работает с этим лишь "на приём" (сложный тип как возвращаемое методом сервиса значение). На передачу - хоть некоторые (вполне авторитетные) источники и пишут про такой вариант, оно не работает... Раз уж ты всё одно не пользуешь фоксовый класс-обёртку пойди ещё дальше, и вообще откажись от SOAP Toolkit - формируй вручную нужного вида HTTP сообщения (это по сути просто XML-и) и посылай через тот же MSXML2.XMLHTTP - примеры поищи были на форуме. Всяко быстрее будет Ещё можно нарисовать на каком дотнете COM видимую сборку - обёртку. Т.е. она будет работать с сервисом (дотнет не использует SOAP Toolkit и с "хиртыми типами" по идее таких проблем не имеет), а фоксу отдавать (и принимать параметры) уже всё в самом простом, "разжёванном" виде. Хотя для столь примитивной задачи (всего 1 метод и 1 запрос по сути) это будет как из пушки по воробьям. P.S. Ты, кстати, неправильно прописал сериализованный вид этого самого объекта. Согласно схеме он должен выглядеть как
------------------ WBR, Igor |
Re: SOAP HRESULT=0x80020005 Несовпадение типов | |
---|---|
vic119 Сообщений: 3 Дата регистрации: 10.12.2014 |
Спасибо, буду разбираться.
|
Re: SOAP HRESULT=0x80020005 Несовпадение типов | |
---|---|
vic119 Сообщений: 3 Дата регистрации: 10.12.2014 |
Спасибо Igor Korolyov!
* ---------------------------------------------------- LOCAL lcRequest, loHTTP, lcResponse TEXT TO lcRequest TEXTMERGE NOSHOW <?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <NdsRequest xmlns="http://ws.unisoft/FNSNDSCAWS/Request"> <NP INN="6441012385" KPP="583601001" DT="08.12.2014" /> <NP INN="5807000079" KPP="580701001" DT="08.12.2014" /> <NP INN="583601113129" DT="08.12.2014" /> </NdsRequest> </soap:Body> </soap:Envelope> ENDTEXT loHTTP= CREATEOBJECT("Msxml2.XMLHTTP.4.0") With loHTTP .Open("POST", 'http://npchk.nalog.ru/FNSNDSCAWS?wsdl', .F.) .setRequestHeader("Content-Type", "text/xml; charset=utf-8") .setRequestHeader("Content-length", LTRIM(STR(LEN(lcRequest)))) .Send(lcRequest) Do While .readyState<>4 DOEVENTS [FORCE] Enddo lcResponse=.responsetext Endwith lcResponse = STREXTRACT(lcResponse,'<S:Body>', '</S:Body>') CREATE CURSOR res (INN char(12), KPP char(9),DT char(10), State char(1)) XMLTOCURSOR(lcResponse,'res',8192) brow |
Проверка статуса контрагента (версия 2), проверяем ИНН/КПП на дату | |
---|---|
Alex Roublev Автор Сообщений: 3695 Откуда: Ярославль Дата регистрации: 28.09.2002 |
------------------ И волки сыты, и овцы целы, и пастуху - вечная память... Исправлено 3 раз(а). Последнее : Alex Roublev, 28.04.17 17:39 |
Re: SOAP HRESULT=0x80020005 Несовпадение типов | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
Чисто шоб побухтеть:
1) Дату лучше как дату в функцию передавать, и там уже преобразовывать в нужный строковый формат (это удобство пользования функцией). 2) Минимальные проверки корректности параметров (тупо на пустоту числострок, на их тип, на "нецифры" в строках, м.б. на размер - я не в курсе это фиксированные величины или нет в РФ, на диапазон для даты) на входе - чтобы не напрягать сервер заведомо некорректным запросом. Всё ж обращение к веб-ресурсу это "дорогая" операция по сравнению с примитивным EMPTY(m.tcInn) или даже чуть более сложном LEN(CHRTRAN(m.tcInn, "0123456789", "")) > 0 3) LOCAL loHttp AS 4) Для извлечения одного лишь state из ответа не нужны курсоры. Прямо из loHTTP.ResponseXML XPath-запросом его и брать. Или даже дубовым STREXTRACT-ом из .ResponseText (но это таки "неаккуратненько") 5) Таймаут бы добавить в цикл (при том с #DEFINE константой для его величины), и апи Sleep(100) или хоть какой Inkey(0.1) - чуток разгрузить систему пока ждём ответ. 6) m.-очек не хватает, небезопасно 7) Я бы отделил Check_INN_KPP(...) AS Number от Decode_Check_Result(tnState AS Number) AS String. Для программной обработки число всяко удобнее чем снова по строке определять статус. Шапочка симпатичная (чувствуется основательность), и пример в начале радуют ------------------ WBR, Igor Исправлено 1 раз(а). Последнее : Igor Korolyov, 27.04.17 14:34 |
Re: Проверка статуса контрагента (версия 2), проверяем ИНН/КПП на дату | |
---|---|
Alex Roublev Автор Сообщений: 3695 Откуда: Ярославль Дата регистрации: 28.09.2002 |
Игорь, большое спасибо за замечания - учёл. Пункт 7 я не понял, как разделить функцию.
------------------ И волки сыты, и овцы целы, и пастуху - вечная память... |
Re: Проверка статуса контрагента (версия 2), проверяем ИНН/КПП на дату | |
---|---|
ssa Сообщений: 13007 Откуда: Москва Дата регистрации: 23.03.2005 |
Пример на скорую руку с "неаккуратненьким" кодом вытаскивания результата: Пример дополни кодом:
------------------ Лень - это неосознанная мудрость. Исправлено 1 раз(а). Последнее : ssa, 27.04.17 18:40 |
Re: SOAP HRESULT=0x80020005 Несовпадение типов | |
---|---|
Igor Korolyov Сообщений: 34580 Дата регистрации: 28.05.2002 |
2 отдельные функции сделать - одна число вертает, вторая конвертит его в строку (чтобы не таскать всюду по проектам этот неслабый многобуквенный ICASE).
Можно и через дополнительный строковый параметр передаваемый по ссылке (т.е. 2 в одном - возвращает она число, а если передан ещё параметр в виде @дай_текст то в него и буквовки запишет). Чуть неудобно, но вполне работоспособно. Ну раз поменял код, то теперь новая порция бухтения 1) Литерал даты не в кошерном виде {^2014.12.08} 2) На ошибку в параметрах лучше указывать при помощи ERROR 11, или ERROR "Моё название ошибки" а не MESAGEBOX-ом. Если это ошибка, конечно. Т.к. по логике работы процедуры вполне можно допускать абы что в параметрах, и тупо возвращать в том же статусе признак. Ну там -2, или -3 - это уже будет "особенность реализации". Т.е. мысль такая - если ошибка, то она должна быть видна как ошибка (и вызывающему коду тоже), если нормальное поведение, просто "особая ветка" - то никаких MESSAGEBOX-ов в принципе не должно быть Кстати, по хорошему такого рода процедура и не должна чего-то как-то MESSAGEBOX-ить (вернуть в качестве статуса, или даже сделать out/ссылочный параметр типа cErrorMessage куда прописывать "текст сообщения" - это можно, хотя и в использовании это не сверх-удобно). И даже wait window будет сомнительным. Т.к. мало ли где кто захочет применить такое - может у него нет _SCREEN-а и wait window будет невидим, или может это вообще програ работающая без окон - и тот же messagebox будет совсем некстати. 3) С m. теперь наоборот переборщил Они нужны лишь в "неоднозначных" местах - в "правых" частях выражений, например. В параметрах вызываемых функций. Для присвоения значения переменной, скажем, m. не нужна 4) SECONDS() небезопасный вариант для таймаута, т.к. "заворачивается" в полночь datetime() как-то получше выглядит. Да и "выход" там может быть форсированным, не через флаг и прогон всего последующего кода. Я бы написал в самом DO WHILE допусловие, а после цикла проверял .status - т.к. там может и не быть никакого ответа, даже если "приём ответа завершён". Статус "нормы" 2xx - ну это HTTP-ное... 5) Под разбором ответа я понимал нечто типа (без обработки ошибок "пустых" объектов и прочего):
------------------ WBR, Igor |
Re: Проверка статуса контрагента (версия 2), проверяем ИНН/КПП на дату | |
---|---|
ssa Сообщений: 13007 Откуда: Москва Дата регистрации: 23.03.2005 |
И, как обычно, переборщил... ИНН может быть или 10 (юрлица), или 12 (ИП и прочие физлица) символов. У ИП КПП ОБЯЗАН быть пустой. Messagebox'ы, как уже указано, совершенно лишние. Третий параметр, как в моем коде, можно сделать "умолчальным" при отсутствии. Описания кодов таки не пополнил. Возьми из моего кода. Использовать cast для преобразования строки в число мне кажется стрельбой из пушки по воробьям. Добавчик: одна! строка
------------------ Лень - это неосознанная мудрость. Исправлено 3 раз(а). Последнее : ssa, 27.04.17 20:12 |
Re: Проверка статуса контрагента (версия 2), проверяем ИНН/КПП на дату | |
---|---|
Alex Roublev Автор Сообщений: 3695 Откуда: Ярославль Дата регистрации: 28.09.2002 |
2 SSA:
Доработал. Но вызов функций у меня получился двумя строчками. ------------------ И волки сыты, и овцы целы, и пастуху - вечная память... |
Re: Проверка статуса контрагента (версия 2), проверяем ИНН/КПП на дату | |
---|---|
Alex Roublev Автор Сообщений: 3695 Откуда: Ярославль Дата регистрации: 28.09.2002 |
2 Igor Korolyov:
Доработал. Синтаксис XPath-запроса оказался для меня незнакомым. Оно конечно для понимания нетрудно, но внове, опыта у меня недостаточно для спокойной работы с таким синтаксисом. ------------------ И волки сыты, и овцы целы, и пастуху - вечная память... |
© 2000-2024 Fox Club  |