A Comprehensive Guide to Sending SOAP Requests Using Python Requests Library

Nov 26, 2025 · Programming · 12 views · 7.8

Keywords: Python | SOAP | requests library | Web Services | XML

Abstract: This article provides an in-depth exploration of sending SOAP requests using Python's requests library, covering XML message construction, HTTP header configuration, response parsing, and other critical technical aspects. Through practical code examples, it demonstrates the direct approach with requests library while comparing it with specialized SOAP libraries like suds and Zeep. The guide helps developers choose appropriate technical solutions based on specific requirements, with detailed analysis of SOAP message structure, troubleshooting techniques, and best practices.

SOAP Protocol and Python Integration Overview

SOAP (Simple Object Access Protocol) remains widely used in enterprise applications as an XML-based web service protocol. Python, as a modern programming language, offers multiple approaches for interacting with SOAP services. The requests library is particularly favored by developers for its simplicity and ease of use in directly handling the HTTP transport layer of SOAP requests.

Sending SOAP Requests with Requests Library

The core of sending SOAP requests via the requests library lies in properly constructing the XML message body and configuring HTTP headers. The following example demonstrates the complete process of calling a weather SOAP service:

import requests

# Define service endpoint
url = "http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL"

# Configure HTTP headers - critical settings
headers = {'content-type': 'text/xml'}

# Construct SOAP message body
body = """<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:ns0="http://ws.cdyne.com/WeatherWS/" 
                   xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
    <SOAP-ENV:Header/>
    <ns1:Body>
        <ns0:GetWeatherInformation/>
    </ns1:Body>
</SOAP-ENV:Envelope>"""

# Send POST request
response = requests.post(url, data=body, headers=headers)
print(response.content)

Key Technical Considerations

Importance of HTTP Header Configuration

Successful execution of SOAP requests heavily depends on correct HTTP header settings. The Content-Type header typically has two options: text/xml or application/soap+xml. While application/soap+xml is more standard-compliant, many deployed services (like the weather service in our example) still require text/xml. Developers must determine the appropriate header value based on the specific service's WSDL documentation.

XML Message Construction Strategies

While hardcoding XML strings directly in code is straightforward, it poses maintenance challenges in production environments. Using template engines like Jinja2 is recommended for managing SOAP message templates:

from jinja2 import Environment, PackageLoader

# Initialize template environment
env = Environment(loader=PackageLoader('myapp', 'templates'))
template = env.get_template('soaprequests/WeatherServiceRequest.xml')

# Render template (can pass dynamic parameters)
body = template.render()

Response Handling and Parsing

The requests library returns raw XML string responses that require further parsing to extract useful information. Python's built-in xml.etree.ElementTree or third-party libraries like lxml can be used for XML parsing.

Comparison with Specialized SOAP Libraries

Using Suds Library

For scenarios requiring higher-level abstraction, the suds library provides an object-oriented SOAP client interface:

from suds.client import Client

url = "http://wsf.cdyne.com/WeatherWS/Weather.asmx?WSDL"
client = Client(url)

# Display service details
print(client)

# Call service method
result = client.service.GetWeatherInformation()
print(result)

The suds library automatically handles WSDL parsing, message serialization, and deserialization, but may have compatibility issues with poorly formatted WSDL documents.

Modern Alternative with Zeep Library

Zeep is another popular SOAP client library offering more modern API design:

import zeep

# Initialize client
wsdl_url = "http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?WSDL"
client = zeep.Client(wsdl=wsdl_url)

# Call service method
result = client.service.CountryIntPhoneCode(sCountryISOCode="IN")
print(f"Phone Code for IN is {result}")

In-depth Analysis of SOAP Message Structure

Envelope Element

The root element of SOAP messages, defining XML document namespaces and encoding styles. Must contain proper namespace declarations to ensure messages are correctly identified as SOAP.

Header Element

Optional element used for passing extended information such as security credentials, transaction management, etc. Achieves extensibility through SOAP module mechanism.

Body Element

Contains actual RPC calls or message content, serving as the core part of SOAP messages. Method names, parameters, and return data are all encapsulated within this element.

Debugging and Troubleshooting Techniques

Network Traffic Analysis

Using tools like tcpdump to capture and analyze actual SOAP message transmissions:

sudo tcpdump -As 0

This helps verify request format correctness and troubleshoot network layer issues.

Common Error Handling

SOAP services may return soap:Fault elements containing detailed error information, including error codes, reason descriptions, and fault nodes. Proper handling of these error messages is crucial for building robust SOAP clients.

Technology Selection Recommendations

Scenarios suitable for choosing requests library:

Scenarios suitable for specialized SOAP libraries:

Best Practices Summary

When working with SOAP services in Python, follow these best practices:

Through appropriate technology selection and adherence to best practices, developers can efficiently and reliably integrate SOAP web services into Python applications.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.