SOAP stands for Simple Object Access Protocol, as the name suggests nothing but a protocol for exchanging structured data between nodes. It uses XML instead of JSON.
In this article, we are going to see how to make SOAP API calls using Python. If you want to test out what exactly the payload and response would look like, you can use the below curl command:
Method 1: Using a Request
First, we import requests library, then we define the SOAP URL.
The next and the most important step is to format the XML body according to the structure provided in the SOAP URL. To know the format, simply visit the SOAP URL and click on CountryISOCode link and format the XML accordingly.
Then you simply prepare the headers and make the POST call.
Code:
Python3
import requests # SOAP request URL # structured XML payload = """<?xml version=\"1.0\" encoding=\"utf-8\"?> <soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"> <soap:Body> <CountryIntPhoneCode xmlns=\"http://www.oorsprong.org/websamples.countryinfo\"> <sCountryISOCode>IN</sCountryISOCode> </CountryIntPhoneCode> </soap:Body> </soap:Envelope>""" # headers headers = { 'Content-Type' : 'text/xml; charset=utf-8' } # POST request response = requests.request( "POST" , url, headers = headers, data = payload) # prints the response print (response.text) print (response) |
Output:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<m:CountryIntPhoneCodeResponse xmlns:m="http://www.oorsprong.org/websamples.countryinfo">
<m:CountryIntPhoneCodeResult>91</m:CountryIntPhoneCodeResult>
</m:CountryIntPhoneCodeResponse>
</soap:Body>
</soap:Envelope>
<Response [200]>
Method 2: Using Zeep
Now that we have seen how to make SOAP calls with requests, we are going to see how easy it is to make it through Zeep. First, you need to install zeep.
pip3 install zeep
Approach:
- First, set the WSDL URL. You can get the WSDL URL simply by visiting the base URL and click on Service Description. That will take you to the WSDL URL. The base URL will be service_url and append the service name after the base URL.
- Next, you need to create a header element. Now, you need to set the header element with method_url and service_url.
- Now, initialize a zeep client with the WSDL URL.
- All the setup is done, now you just need to call the zeep service with the service name, here the service name is CountryIntPhoneCode. You need to pass the parameters with the country_code and also pass the header to _soapheaders as a list.
- Now, this would directly return the phone code of the country.
Code:
Python3
import zeep # set the WSDL URL # set method URL # set service URL # create the header element header = zeep.xsd.Element( "Header" , zeep.xsd.ComplexType( [ zeep.xsd.Element( ), zeep.xsd.Element( ), ] ), ) # set the header value from header element header_value = header(Action = method_url, To = service_url) # initialize zeep client client = zeep.Client(wsdl = wsdl_url) # set country code for India country_code = "IN" # make the service call result = client.service.CountryIntPhoneCode( sCountryISOCode = country_code, _soapheaders = [header_value] ) # print the result print (f "Phone Code for {country_code} is {result}" ) # set country code for United States country_code = "US" # make the service call result = client.service.CountryIntPhoneCode( sCountryISOCode = country_code, _soapheaders = [header_value] ) # POST request response = client.service.CountryIntPhoneCode( sCountryISOCode = country_code, _soapheaders = [header_value] ) # print the result print (f "Phone Code for {country_code} is {result}" ) print (response) |
Output:
Phone Code for IN is 91
Phone Code for US is 1
<Response [200]>