Преобразование Soap XML запроса в словарь для Zeep - PullRequest
1 голос
/ 05 марта 2020

У меня проблемы с преобразованием XML в соответствующий python словарь soap запрос для передачи в Zeep.Client.service. XML ниже взято из:

https://psix.uscg.mil/XML/PSIXData.asmx?op=getVesselSummaryXMLString

    POST /XML/PSIXData.asmx HTTP/1.1
    Host: psix.uscg.mil
    Content-Type: application/soap+xml; charset=utf-8
    Content-Length: length

    <?xml version="1.0" encoding="utf-8"?>
    <soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
      <soap12:Body>
        <getVesselSummaryXMLString xmlns="http://cgmix.uscg.mil">
          <VesselID>string</VesselID>
          <VesselName>string</VesselName>
          <CallSign>string</CallSign>
          <VIN>string</VIN>
          <HIN>string</HIN>
          <Flag>string</Flag>
          <Service>string</Service>
          <BuildYear>string</BuildYear>
        </getVesselSummaryXMLString>
      </soap12:Body>
    </soap12:Envelope>

В конечном итоге я хочу отправить запрос на сервер soap с кодом ниже, используя python словарь как "request_data", а не XML выше, я просто не уверен, какой словарь понадобится.

url = 'https://cgmix.uscg.mil/xml/PSIXData.asmx?WSDL'
wsdl = url
client = zeep.Client(wsdl)
r = client.service.getVesselSummaryXMLString(request_data)

1 Ответ

2 голосов
/ 06 марта 2020

вы можете проверить методы wsdl, используя это:

python -mzeep https://cgmix.uscg.mil/xml/PSIXData.asmx?WSDL

сверху, мы видим, что метод getVesselSummaryXMLString принимает только строковые аргументы:

getVesselSummaryXMLString(VesselID: xsd:string, VesselName: xsd:string, CallSign: xsd:string, VIN: xsd:string, HIN: xsd:string, Flag: xsd:string, Service: xsd:string, BuildYear: xsd:string) -> getVesselSummaryXMLStringResult: xsd:string

Итак, вы Вы можете вызывать его просто, передавая строковые аргументы, точно так же, как вызов функции:

r = client.service.getVesselSummaryXMLString('str1', 'str2', 'str3', 'str4', 'str5', 'str6', 'str7', 'str8')

Если вы хотите отправить словарь, вам нужно подготовить команду следующим образом:

request_data = {'VesselID': 'str1', 'VesselName': 'string', 'CallSign': 'string', 'VIN': 'string', 'HIN': 'string', 'Flag': 'string', 'Service': 'string', 'BuildYear': 'str8'}
 r = client.service.getVesselSummaryXMLString(**request_data )

надеюсь, что это отвечает на вопрос.

...