-
-
Save Amice13/9f1ad0e93f003d25c3c3e6152365755c to your computer and use it in GitHub Desktop.
# Человекочитаемое описание результатов запроса здесь: https://www.drv.gov.ua/ords/portal/!cm_core.cm_index?option=ext_static_page&ppg_id=262&pmn_id=161 | |
# Получение данных про органы распорядителей и ведения Реестра избирателей | |
curl --header "Content-Type: text/xml;charset=UTF-8" --data "<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:drv=\"http://www.drv.gov.ua/\"><soap:Header/><soap:Body><drv:GetOrgansService /></soap:Body></soap:Envelope>" https://www.drv.gov.ua/ords/svc/personal/API/Opendata | |
# Получение данных про избирательные округи | |
curl --header "Content-Type: text/xml;charset=UTF-8" --data "<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:drv=\"http://www.drv.gov.ua/\"><soap:Header/><soap:Body><drv:GetAreas /></soap:Body></soap:Envelope>" https://www.drv.gov.ua/ords/svc/personal/API/Opendata | |
# Получение данных про избирательные участки. Необходимо менять параметр Area (получаются из сервиса GetAreas) | |
curl --header "Content-Type: text/xml;charset=UTF-8" --data "<?xml version=\"1.0\" encoding=\"UTF-8\"?><soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:drv=\"http://www.drv.gov.ua/\"><soap:Header/><soap:Body><drv:GetPollingStations><drv:PSParams><drv:Area>2</drv:Area></drv:PSParams></drv:GetPollingStations></soap:Body></soap:Envelope>" https://www.drv.gov.ua/ords/svc/personal/API/Opendata | |
# Получение данных про области Украины | |
curl --header "Content-Type: text/xml;charset=UTF-8" --data "<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:drv=\"http://www.drv.gov.ua/\"><soap:Header/><soap:Body><drv:GetRegionsService /></soap:Body></soap:Envelope>" https://www.drv.gov.ua/ords/svc/personal/API/Opendata | |
# Получение данных про территориально административные единицы областей. Необходимо менять параметр Reg_ID (получаются из сервиса GetRegionsService) | |
curl --header "Content-Type: text/xml;charset=UTF-8" --data "<?xml version=\"1.0\" encoding=\"UTF-8\"?><soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:drv=\"http://www.drv.gov.ua/\"><soap:Header/><soap:Body><drv:GetATO><drv:ATOParams><drv:Reg_ID>1</drv:Reg_ID></drv:ATOParams></drv:GetATO></soap:Body></soap:Envelope>" https://www.drv.gov.ua/ords/svc/personal/API/Opendata | |
# Получение данных про адресную базу территориально административной единицы. Необходимо менять ATO_ID (получаются из сервиса GetATO) | |
curl --header "Content-Type: text/xml;charset=UTF-8" --data "<?xml version=\"1.0\" encoding=\"UTF-8\"?><soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:drv=\"http://www.drv.gov.ua/\"><soap:Header/><soap:Body><drv:GetAdrReg><drv:AdrRegParams><drv:ATO_ID>8361</drv:ATO_ID></drv:AdrRegParams></drv:GetAdrReg></soap:Body></soap:Envelope>" https://www.drv.gov.ua/ords/svc/personal/API/Opendata |
Хм. Я попытался пообщаться с этим с помощью Python и Zeep, получилось так:
-
Сервер выдаёт 403, когда внутри заголовка
Content-Type
есть параметрaction
. Кажется, это огрех сервера. Но конкретно Zeep умудряется ещё и передать в этом местеaction="None"
. Это решает вот такой monkey patch:from zeep.wsdl.bindings.soap import Soap12Binding def _set_http_headers(self, serialized, operation): serialized.headers['Content-Type'] = '; '.join( ['application/soap+xml', 'charset=utf-8'] + (['action="%s"' % operation.soapaction] if operation.soapaction is not None else []) ) Soap12Binding._set_http_headers = _set_http_headers
(Потом напишу PR, может, кто мне объяснит, что происходит.)
-
Я почитал WSDL 1.1 Binding Extensions for SOAP 1.2, и кажется, что у всех операций вообще-то должно быть либо проставлен
атрибутsoapAction
, либо должно стоятьsoapActionRequired="false"
. Конкретно на Zeep это не влияет никак, так что я ничего с этим делать не стал. -
Наконец, чтобы работали операции без аргументов (
GetRegions
,GetOrgans
,GetAreas
), нужно исправить в WSDL’е описание параметров:--- drv.wsdl.orig 2019-04-15 22:10:39.410595543 +0300 +++ drv.wsdl 2019-04-15 22:18:22.328439308 +0300 @@ -8,6 +8,10 @@ <wsdl:types> <s:schema elementFormDefault="qualified" targetNamespace="http://www.drv.gov.ua/"> + <s:element name="GetRegionsService"> + <s:complexType /> + </s:element> + <s:element name="RegionsList"> <s:complexType> <s:annotation> @@ -45,6 +49,10 @@ </s:sequence> </s:complexType> + <s:element name="GetOrgansService"> + <s:complexType /> + </s:element> + <s:element name="OrgansList"> <s:complexType> <s:annotation> @@ -82,7 +90,13 @@ </s:element> </s:sequence> </s:complexType> - </s:element><s:element name="AreasList"> + </s:element> + + <s:element name="GetAreas"> + <s:complexType /> + </s:element> + + <s:element name="AreasList"> <s:complexType> <s:annotation> <s:documentation> @@ -342,11 +356,17 @@ </s:complexType> </s:element> </s:schema></wsdl:types> -<wsdl:message name="GetRegionsReqMessage" /><wsdl:message name="GetRegionsRespMessage"> +<wsdl:message name="GetRegionsReqMessage"> + <wsdl:part name="parameters" element="tns:GetRegionsService" /> + </wsdl:message><wsdl:message name="GetRegionsRespMessage"> <wsdl:part name="parameters" element="tns:RegionsList" /> - </wsdl:message><wsdl:message name="GetOrgansReqMessage" /><wsdl:message name="GetOrgansRespMessage"> + </wsdl:message><wsdl:message name="GetOrgansReqMessage"> + <wsdl:part name="parameters" element="tns:GetOrgansService" /> + </wsdl:message><wsdl:message name="GetOrgansRespMessage"> <wsdl:part name="parameters" element="tns:OrgansList" /> - </wsdl:message><wsdl:message name="GetAreasReqMessage" /> <wsdl:message name="GetAreasRespMessage"> + </wsdl:message><wsdl:message name="GetAreasReqMessage"> + <wsdl:part name="parameters" element="tns:GetAreas" /> + </wsdl:message><wsdl:message name="GetAreasRespMessage"> <wsdl:part name="parameters" element="tns:AreasList" /> </wsdl:message>
С этими изменениями этот пример переносится на Python и Zeep буквально и всё вроде бы работает. Но я в SOAP не понимаю примерно ничего, так что если в их WSDL’е ещё что-то не так, скажите.
Оу! Круто! Попробую на досуге. Спасибо!
https://github.com/Barvy/DrvSDK тримайте.
Хм. Я попытался пообщаться с этим с помощью Python и Zeep, получилось так:
Сервер выдаёт 403, когда внутри заголовка
Content-Type
есть параметрaction
. Кажется, это огрех сервера. Но конкретно Zeep умудряется ещё и передать в этом местеaction="None"
. Это решает вот такой monkey patch:from zeep.wsdl.bindings.soap import Soap12Binding def _set_http_headers(self, serialized, operation): serialized.headers['Content-Type'] = '; '.join( ['application/soap+xml', 'charset=utf-8'] + (['action="%s"' % operation.soapaction] if operation.soapaction is not None else []) ) Soap12Binding._set_http_headers = _set_http_headers(Потом напишу PR, может, кто мне объяснит, что происходит.)
Я почитал WSDL 1.1 Binding Extensions for SOAP 1.2, и кажется, что у всех операций вообще-то должно быть либо проставлен
атрибутsoapAction
, либо должно стоятьsoapActionRequired="false"
. Конкретно на Zeep это не влияет никак, так что я ничего с этим делать не стал.Наконец, чтобы работали операции без аргументов (
GetRegions
,GetOrgans
,GetAreas
), нужно исправить в WSDL’е описание параметров:--- drv.wsdl.orig 2019-04-15 22:10:39.410595543 +0300 +++ drv.wsdl 2019-04-15 22:18:22.328439308 +0300 @@ -8,6 +8,10 @@ <wsdl:types> <s:schema elementFormDefault="qualified" targetNamespace="http://www.drv.gov.ua/"> + <s:element name="GetRegionsService"> + <s:complexType /> + </s:element> + <s:element name="RegionsList"> <s:complexType> <s:annotation> @@ -45,6 +49,10 @@ </s:sequence> </s:complexType> + <s:element name="GetOrgansService"> + <s:complexType /> + </s:element> + <s:element name="OrgansList"> <s:complexType> <s:annotation> @@ -82,7 +90,13 @@ </s:element> </s:sequence> </s:complexType> - </s:element><s:element name="AreasList"> + </s:element> + + <s:element name="GetAreas"> + <s:complexType /> + </s:element> + + <s:element name="AreasList"> <s:complexType> <s:annotation> <s:documentation> @@ -342,11 +356,17 @@ </s:complexType> </s:element> </s:schema></wsdl:types> -<wsdl:message name="GetRegionsReqMessage" /><wsdl:message name="GetRegionsRespMessage"> +<wsdl:message name="GetRegionsReqMessage"> + <wsdl:part name="parameters" element="tns:GetRegionsService" /> + </wsdl:message><wsdl:message name="GetRegionsRespMessage"> <wsdl:part name="parameters" element="tns:RegionsList" /> - </wsdl:message><wsdl:message name="GetOrgansReqMessage" /><wsdl:message name="GetOrgansRespMessage"> + </wsdl:message><wsdl:message name="GetOrgansReqMessage"> + <wsdl:part name="parameters" element="tns:GetOrgansService" /> + </wsdl:message><wsdl:message name="GetOrgansRespMessage"> <wsdl:part name="parameters" element="tns:OrgansList" /> - </wsdl:message><wsdl:message name="GetAreasReqMessage" /> <wsdl:message name="GetAreasRespMessage"> + </wsdl:message><wsdl:message name="GetAreasReqMessage"> + <wsdl:part name="parameters" element="tns:GetAreas" /> + </wsdl:message><wsdl:message name="GetAreasRespMessage"> <wsdl:part name="parameters" element="tns:AreasList" /> </wsdl:message>С этими изменениями этот пример переносится на Python и Zeep буквально и всё вроде бы работает. Но я в SOAP не понимаю примерно ничего, так что если в их WSDL’е ещё что-то не так, скажите.
взагалі, я намагався довго імпортувати цей wsdl натівними засобами .net, все генерується ОК, але якась несумісність на рівні версій протоколу, тощо. Витративши багато часу на це, вирішив забити. Намагався навіть під .net2.0 його згенерувати.
У мене є сумніви, що цей WSDL невалідний, бо така тулза як https://www.plumvoice.com/soaptester/ (судячи зі всього щось там на пхп працює), плюс аналізатор https://www.wsdl-analyzer.com/, плюс SoapUI працюють з ним ОК.
Юзав SoapUI як референс для отримання данних при створенні кліента на .net core.
Если бы был небитый WSDL, то все было бы немного проще.