Hacer llamadas a la API de SOAP usando Python

SOAP significa Protocolo simple de acceso a objetos , ya que el nombre sugiere nada más que un protocolo para intercambiar datos estructurados entre Nodes. Utiliza XML en lugar de JSON.

En este artículo vamos a ver cómo hacer llamadas a la API de SOAP usando python. Si desea probar cómo se vería exactamente la carga útil y la respuesta, puede usar el siguiente comando curl:

Salida de rizo

Método 1: Uso de la solicitud

Primero, importamos la biblioteca de requests , luego definimos la URL de SOAP. 

El siguiente paso, y el más importante, es formatear el cuerpo XML de acuerdo con la estructura proporcionada en la URL de SOAP. Para conocer el formato, simplemente visite la URL de SOAP y haga clic en el enlace CountryISOCode y formatee el XML en consecuencia.

Luego, simplemente prepara los encabezados y realiza la llamada POST.

Código:

Python3

import requests
# SOAP request URL
url = "http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso"
  
# 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)

Producción:

<?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]>

Método 2: Usar Zeep

Ahora que hemos visto cómo hacer llamadas SOAP con requests, vamos a ver lo fácil que es hacerlo a través de Zeep. Primero, necesitas instalar Zeep .

pip3 install zeep

Acercarse:

  • Primero, configure la URL de WSDL. Puede obtener la URL de WSDL simplemente visitando la URL base y haciendo clic en Descripción del servicio . Eso lo llevará a la URL de WSDL. La URL base será service_url y agregará el nombre del servicio después de la URL base.
  • A continuación, debe crear un elemento de encabezado. Ahora, debe configurar el elemento de encabezado con method_url y service_url .
  • Ahora, inicialice un cliente Zeep con la URL de WSDL.
  • Toda la configuración está lista, ahora solo necesita llamar al servicio Zeep con el nombre del servicio, aquí el nombre del servicio es CountryIntPhoneCode . Debe pasar los parámetros con el código de país y también pasar el encabezado a _soapheaders como una lista.
  • Ahora, esto devolvería directamente el código telefónico del país.

Código:

Python3

import zeep
  
# set the WSDL URL
wsdl_url = "http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso?WSDL"
  
# set method URL
method_url = "http://webservices.oorsprong.org/websamples.countryinfo/CountryIntPhoneCode"
  
# set service URL
service_url = "http://webservices.oorsprong.org/websamples.countryinfo/CountryInfoService.wso"
  
# create the header element
header = zeep.xsd.Element(
    "Header",
    zeep.xsd.ComplexType(
        [
            zeep.xsd.Element(
                "{http://www.w3.org/2005/08/addressing}Action", zeep.xsd.String()
            ),
            zeep.xsd.Element(
                "{http://www.w3.org/2005/08/addressing}To", zeep.xsd.String()
            ),
        ]
    ),
)
# 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]
)
  
# print the result
print(f"Phone Code for {country_code} is {result}")
print(response)

Producción:

Phone Code for IN is 91
Phone Code for US is 1
<Response [200]>

Publicación traducida automáticamente

Artículo escrito por debdutgoswami y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *