Как передать флаг CDATA в XML-запрос JSON ZEEP SOAP - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь передать флаг CDATA запросу SOAP с использованием библиотеки Python Zeep, но Zeep игнорирует поля с CDATA, поэтому поиск слишком широкий, а возвращаемые данные намного больше, чем мне нужно. К сожалению, выбор субкадра с пандами позже не возможен, иначе все будет хорошо.

Запрос представляет собой запрос к базе данных SQL-сервера, и я могу получить данные с помощью SOAP UI с помощью следующего:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsc="some_domain.com">
   <soapenv:Header/>
   <soapenv:Body>
      <wsc:search>
         <arg0>
            <userName>user</userName>
            <password>pass</password>
            <criteria>
               <some_name>
                  <field_one>CS</field_one>
                  <date_field>>2019-04-22</date_field>
                  <![CDATA[<timestamp_field>>2019-04-22 00:00:00.000</timestamp_field>]]>
               </some_name>
            </criteria>
            <maxRows>5</maxRows>
         </arg0>
      </wsc:search>
   </soapenv:Body>
</soapenv:Envelope>

По некоторым причинам поле даты работает нормально, но отметка времени требует использования CDATA, в противном случае я получаю сообщение об ошибке. Отсюда мой ТАК вопрос; как мне добиться того же с Zeep? Я думаю, это означает, что я должен передать флаг CDATA в JSON.

Я просмотрел документацию по SO, GitHub и Zeep, но нигде не могу найти пример передачи CDATA в Zeep или передачи флагов CDATA в JSON, который затем используется для создания XML-запроса SOAP.

Возможна ли передача CDATA в JSON? Возможно, кто-то знает, как передать точный конверт xml, который я показал выше, в Zeep (принимая во внимание, что в приведенном выше нет URI WSDL, определяющего сервис)?

Вот полный пример сценария

Пример Схема WSDL

И ... XML-запрос и ответ

Обычно я настраиваю службу, формирую JSON для создания запроса и передаю его в arg0.

from zeep import Client

import zeep
from zeep.transports import Transport

searchTerm = 'ns0:metaWsSearchRequest'
wsdl_url = 'some_url' 
XML_viewname = 'SOMENAME'

transport = Transport(timeout=600)
zeep_client = Client(wsdl=wsdl_url, transport=transport)

# I am looking for the correct way to structure this JSON request if I have to pass CDATA

find_criteria_filled = {
    'userName': user,
    'password': pwd,
    'sessionId': None,
    'criteria': {
        'SOMENAME': {
            '<![CDATA[some_column_name3]]>': '2019-04-22 00:00:00.000',
            'some_column_name1': 'CS'
        }
    },
    'maxRows': '1'
}

response = zeep_client.service.search(arg0=find_criteria_filled)

В результате в запросе пропускается some_column_name3, поэтому поиск выполняется некорректно. Вместо того, чтобы показывать одну запись для 22-го числа, он возвращает первую запись для поиска по 'some_column_name1': 'CS', в которой, как оказалось, указана дата 2019-04-25.

Я попробовал эти комбинации без удачи:

'<![CDATA[some_column_name3]]>': '2019-04-22 00:00:00.000'

'![CDATA[some_column_name3]]': '2019-04-22 00:00:00.000'

'some_column_name3': '<![CDATA[2019-04-22 00:00:00.000]]>'

Любая помощь будет очень признательна. Спасибо.

...