Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Запросы в 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

This comment has been minimized.

Copy link

@pomazanbohdan pomazanbohdan commented Mar 20, 2019

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

@Amice13

This comment has been minimized.

Copy link
Owner Author

@Amice13 Amice13 commented Mar 20, 2019

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

@alexshpilkin

This comment has been minimized.

Copy link

@alexshpilkin 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

This comment has been minimized.

Copy link
Owner Author

@Amice13 Amice13 commented Apr 17, 2019

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

@bondarenkod

This comment has been minimized.

Copy link

@bondarenkod bondarenkod commented Jul 2, 2019

@bondarenkod

This comment has been minimized.

Copy link

@bondarenkod 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