Я пытаюсь передать флаг 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]]>'
Любая помощь будет очень признательна. Спасибо.