2010-04-02 14 views

Respuesta

8

Sí, he hecho esto en ciertos casos donde SOAPpy no funcionó con un esquema dado. Esto debería ayudarte a comenzar.

import httplib 
from xml.dom import minidom 

http.request("POST", "/path/to/my/webservice", body=xml, headers = { 
    "Host": "myservername", 
    "Content-Type": "text/xml; charset=UTF-8", 
    "Content-Length": len(xml) 
}) 

print minidom.parseString(http.getresponse().read()) 

Para la cadena de contenido, me gustaría utilizar SoapUI para hacer las solicitudes de forma manual, y luego imitar el código XML.

3

Sí, ver http://www.w3schools.com/SOAP/soap_httpbinding.asp

Un método SOAP es un HTTP petición/respuesta que cumpla con las reglas de codificación SOAP.

HTTP + = XML SOAP de solicitud

un jabón podría ser un HTTP POST o una solicitud HTTP GET.

A veces encontrará otros mecanismos de transporte utilizados por razones de calidad de servicio, por ejemplo, utilizando un marco de mensajería.

+0

Enlace roto: solo un aviso. – alexplanation

0

Encontré un gran ejemplo de esto en el paquete simple-salesforce. El código está en login.py y se pega debajo de

soap_url = 'https://{domain}.salesforce.com/services/Soap/u/{sf_version}' 
domain = 'test' if sandbox else 'login' 

soap_url = soap_url.format(domain=domain, sf_version=sf_version) 

username = escape(username) 
password = escape(password) 

# Check if token authentication is used 
if 'security_token' in kwargs: 
    security_token = kwargs['security_token'] 

    # Security Token Soap request body 
    login_soap_request_body = """<?xml version="1.0" encoding="utf-8" ?> 
    <env:Envelope 
      xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> 
     <env:Body> 
      <n1:login xmlns:n1="urn:partner.soap.sforce.com"> 
       <n1:username>{username}</n1:username> 
       <n1:password>{password}{token}</n1:password> 
      </n1:login> 
     </env:Body> 
    </env:Envelope>""".format(username=username, password=password, token=security_token) 

# Check if IP Filtering is used in cojuction with organizationId 
elif 'organizationId' in kwargs: 
    organizationId = kwargs['organizationId'] 

    # IP Filtering Login Soap request body 
    login_soap_request_body = """<?xml version="1.0" encoding="utf-8" ?> 
    <soapenv:Envelope 
      xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
      xmlns:urn="urn:partner.soap.sforce.com"> 
     <soapenv:Header> 
      <urn:CallOptions> 
       <urn:client>RestForce</urn:client> 
       <urn:defaultNamespace>sf</urn:defaultNamespace> 
      </urn:CallOptions> 
      <urn:LoginScopeHeader> 
       <urn:organizationId>{organizationId}</urn:organizationId> 
      </urn:LoginScopeHeader> 
     </soapenv:Header> 
     <soapenv:Body> 
      <urn:login> 
       <urn:username>{username}</urn:username> 
       <urn:password>{password}</urn:password> 
      </urn:login> 
     </soapenv:Body> 
    </soapenv:Envelope>""".format(
     username=username, password=password, organizationId=organizationId) 

else: 
    except_code = 'INVALID AUTH' 
    except_msg = 'You must submit either a security token or organizationId for authentication' 
    raise SalesforceAuthenticationFailed(except_code, except_msg) 

login_soap_request_headers = { 
    'content-type': 'text/xml', 
    'charset': 'UTF-8', 
    'SOAPAction': 'login' 
} 
response = requests.post(soap_url, 
         login_soap_request_body, 
         headers=login_soap_request_headers, 
         proxies=kwargs.get('proxies', None))