Skip to content

Instantly share code, notes, and snippets.

@Amice13
Last active February 3, 2023 23:26
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save Amice13/9f1ad0e93f003d25c3c3e6152365755c to your computer and use it in GitHub Desktop.
Save Amice13/9f1ad0e93f003d25c3c3e6152365755c to your computer and use it in GitHub Desktop.
Запросы в CURL для данных Реестра избирателей
# Человекочитаемое описание результатов запроса здесь: 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
@pomazanbohdan
Copy link

Но ведь это какой то трандец )))

@Amice13
Copy link
Author

Amice13 commented Mar 20, 2019

Если бы был небитый WSDL, то все было бы немного проще.

@alexshpilkin
Copy link

alexshpilkin commented Apr 15, 2019

Хм. Я попытался пообщаться с этим с помощью 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’е ещё что-то не так, скажите.

@Amice13
Copy link
Author

Amice13 commented Apr 17, 2019

Оу! Круто! Попробую на досуге. Спасибо!

@bondarenkod
Copy link

@bondarenkod
Copy link

bondarenkod commented Jul 2, 2019

Хм. Я попытался пообщаться с этим с помощью 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.

2019-07-03_01-00-22-390de601-9c1d-42f6-80c9-2f9ea0b4e5ed-ReadyAPI 1

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment