05-05-2022 05:51 AM - last edited on 05-06-2022 08:29 AM by Paul Zimmerman
SoapUI is probably the most useful and powerful way to test out SOAP operations when writing code for CUCM (such as AXL, Serviceability, among other APIs) and even Cisco IM&P APIs like Presence Web Services and EPASSoap.
And Zeep is a favorite way to implement these SOAP-based scripts and programs in Python.
The trouble is that SoapUI uses XML and Zeep expects JSON.
CHALLENGE:
Write a Python/Zeep script that allows you to copy and paste the XML from a working SOAP request in SoapUI into your Python code and automatically convert it into JSON that Zeep uses. Here's the sample getPhone XML for the challenge:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="http://www.cisco.com/AXL/API/12.5">
<soapenv:Header/>
<soapenv:Body>
<ns:getPhone>
<name>INSERT PHONE NAME HERE</name>
<returnedTags>
<name></name>
<description></description>
<lines>
<line>
<index>1</index>
<dirn>
<pattern></pattern>
</dirn>
<callInfoDisplay>
<callerName></callerName>
</callInfoDisplay>
<associatedEndusers>
<enduser>
<userId></userId>
</enduser>
</associatedEndusers>
</line>
<line>
<index>2</index>
<dirn>
<pattern></pattern>
</dirn>
<callInfoDisplay>
<callerName></callerName>
</callInfoDisplay>
<associatedEndusers>
<enduser>
<userId></userId>
</enduser>
</associatedEndusers>
</line>
</lines>
</returnedTags>
</ns:getPhone>
</soapenv:Body>
</soapenv:Envelope>
RULES:
1. You must have at least two lines associated with the phone, which means you have to deal with duplicate tags in one request.
2. You must have at least two associated end users with one of the lines (there are at least 2 lines, but you can associate 2 or more users with as many of the lines as you want).
3. You can implement it with a copy/paste into the code, or simply copy/paste it into a file and have your code read the file.
4. You can copy and paste everything between <ns:getPhone> and </ns:getPhone>, or copy and past the whole XML enchilada. It's up to you.
5. Make sure your code displays the response from the SOAP request.
6. You can post just the code that performs the challenge, or an entire script with includes, etc.
Post (or attach a Python file to your post) your suggestions! Anything, good or bad, will help the Community, so please chime in with your approaches!
If someone posts something that is incorrect, overly complex, or too cryptic, please be considerate with your corrections or alternatives! This is a TEAM sport!
Solved! Go to Solution.
05-09-2022 05:59 AM
Hi!
Hope I followed all rule
I would be happy to receive feedback and suggestions for improvement.
Request ------- Headers: {'SOAPAction': '"CUCM:DB ver=12.5 getPhone"', 'Content-Type': 'text/xml; charset=utf-8'} Body: <soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"> <soap-env:Body> <ns0:getPhone xmlns:ns0="http://www.cisco.com/AXL/API/12.5"> <name>SEP000000000000</name> <returnedTags> <name></name> <description></description> <lines> <line> <index>1</index> <dirn> <pattern></pattern> </dirn> <callInfoDisplay> <callerName></callerName> </callInfoDisplay> <associatedEndusers> <enduser> <userId></userId> </enduser> </associatedEndusers> </line> <line> <index>2</index> <dirn> <pattern></pattern> </dirn> <callInfoDisplay> <callerName></callerName> </callInfoDisplay> <associatedEndusers> <enduser> <userId></userId> </enduser> </associatedEndusers> </line> </lines> </returnedTags> </ns0:getPhone> </soap-env:Body> </soap-env:Envelope> Response ------- Headers: {'Set-Cookie': 'JSESSIONIDSSO=D1933AF99256FFB98FD039567AEA2433; Path=/; Secure; HttpOnly, JSESSIONID=C8037704C289A43167CA3A32B153E910; Path=/axl; Secure; HttpOnly', 'X-Frame-Options': 'SAMEORIGIN', 'Strict-Transport-Security': 'max-age=31536000; includeSubdomains', 'Content-Security-Policy': "default-src *; script-src * 'unsafe-inline' 'unsafe-eval';style-src * 'unsafe-inline'; img-src * data: 'unsafe-inline';", 'X-Content-Type-Options': 'nosniff', 'X-XSS-Protection': '1; mode=block', 'Content-Type': 'text/xml;charset=UTF-8', 'Content-Length': '1041', 'Date': 'Mon, 09 May 2022 12:44:17 GMT', 'Server': ''} Body: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Body> <ns:getPhoneResponse xmlns:ns="http://www.cisco.com/AXL/API/12.5"> <return> <phone ctiid="4531" uuid="{FE2C4C44-F3DE-E447-1AFF-4DFE9C9ACF17}"> <name>SEP000000000000</name> <description>#FN##LN##ID#</description> <lines> <line uuid="{B8FED489-97C3-B9D1-2780-C671F77B7D16}"> <index>1</index> <dirn uuid="{7DE28330-7816-46D4-6E94-88ACAAE04467}"> <pattern>\+1000</pattern> </dirn> <callInfoDisplay> <callerName>false</callerName> </callInfoDisplay> <associatedEndusers> <enduser> <userId>user1000</userId> </enduser> </associatedEndusers> </line> <line uuid="{7E07AFA2-5491-9A1E-109A-D222A2AB6A24}"> <index>2</index> <dirn uuid="{7CB6E096-2C8A-86DF-35EA-05649BE473C6}"> <pattern>\+1001</pattern> </dirn> <callInfoDisplay> <callerName>false</callerName> </callInfoDisplay> <associatedEndusers> <enduser> <userId>user1001</userId> </enduser> </associatedEndusers> </line> </lines> </phone> </return> </ns:getPhoneResponse> </soapenv:Body> </soapenv:Envelope>
05-09-2022 05:59 AM
Hi!
Hope I followed all rule
I would be happy to receive feedback and suggestions for improvement.
Request ------- Headers: {'SOAPAction': '"CUCM:DB ver=12.5 getPhone"', 'Content-Type': 'text/xml; charset=utf-8'} Body: <soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"> <soap-env:Body> <ns0:getPhone xmlns:ns0="http://www.cisco.com/AXL/API/12.5"> <name>SEP000000000000</name> <returnedTags> <name></name> <description></description> <lines> <line> <index>1</index> <dirn> <pattern></pattern> </dirn> <callInfoDisplay> <callerName></callerName> </callInfoDisplay> <associatedEndusers> <enduser> <userId></userId> </enduser> </associatedEndusers> </line> <line> <index>2</index> <dirn> <pattern></pattern> </dirn> <callInfoDisplay> <callerName></callerName> </callInfoDisplay> <associatedEndusers> <enduser> <userId></userId> </enduser> </associatedEndusers> </line> </lines> </returnedTags> </ns0:getPhone> </soap-env:Body> </soap-env:Envelope> Response ------- Headers: {'Set-Cookie': 'JSESSIONIDSSO=D1933AF99256FFB98FD039567AEA2433; Path=/; Secure; HttpOnly, JSESSIONID=C8037704C289A43167CA3A32B153E910; Path=/axl; Secure; HttpOnly', 'X-Frame-Options': 'SAMEORIGIN', 'Strict-Transport-Security': 'max-age=31536000; includeSubdomains', 'Content-Security-Policy': "default-src *; script-src * 'unsafe-inline' 'unsafe-eval';style-src * 'unsafe-inline'; img-src * data: 'unsafe-inline';", 'X-Content-Type-Options': 'nosniff', 'X-XSS-Protection': '1; mode=block', 'Content-Type': 'text/xml;charset=UTF-8', 'Content-Length': '1041', 'Date': 'Mon, 09 May 2022 12:44:17 GMT', 'Server': ''} Body: <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Body> <ns:getPhoneResponse xmlns:ns="http://www.cisco.com/AXL/API/12.5"> <return> <phone ctiid="4531" uuid="{FE2C4C44-F3DE-E447-1AFF-4DFE9C9ACF17}"> <name>SEP000000000000</name> <description>#FN##LN##ID#</description> <lines> <line uuid="{B8FED489-97C3-B9D1-2780-C671F77B7D16}"> <index>1</index> <dirn uuid="{7DE28330-7816-46D4-6E94-88ACAAE04467}"> <pattern>\+1000</pattern> </dirn> <callInfoDisplay> <callerName>false</callerName> </callInfoDisplay> <associatedEndusers> <enduser> <userId>user1000</userId> </enduser> </associatedEndusers> </line> <line uuid="{7E07AFA2-5491-9A1E-109A-D222A2AB6A24}"> <index>2</index> <dirn uuid="{7CB6E096-2C8A-86DF-35EA-05649BE473C6}"> <pattern>\+1001</pattern> </dirn> <callInfoDisplay> <callerName>false</callerName> </callInfoDisplay> <associatedEndusers> <enduser> <userId>user1001</userId> </enduser> </associatedEndusers> </line> </lines> </phone> </return> </ns:getPhoneResponse> </soapenv:Body> </soapenv:Envelope>
05-09-2022 08:01 AM
Excellent!! Elegance and simplicity!
Discover and save your favorite ideas. Come back to expert answers, step-by-step guides, recent topics, and more.
New here? Get started with these tips. How to use Community New member guide