2010-04-02 53 views

Trả lời

8

Vâng, tôi đã thực hiện việc này trong một số trường hợp mà SOAPpy không hoạt động với một lược đồ đã cho. Điều này sẽ giúp bạn bắt đầu.

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()) 

Đối với chuỗi nội dung, tôi sẽ sử dụng SoapUI để làm cho các yêu cầu bằng tay, và sau đó bắt chước các XML.

3

Vâng, thấy http://www.w3schools.com/SOAP/soap_httpbinding.asp

Một phương pháp SOAP là một HTTP request/response tuân thủ các quy tắc mã hóa SOAP.

HTTP + XML = SOAP yêu cầu

Một SOAP có thể là một HTTP POST hoặc một yêu cầu HTTP GET.

Đôi khi bạn sẽ tìm thấy các cơ chế truyền tải khác được sử dụng vì lý do chất lượng dịch vụ, ví dụ bằng cách sử dụng khung thông báo.

+0

Liên kết bị hỏng - chỉ cần hướng lên trên. – alexplanation

0

Tôi đã tìm thấy ví dụ tuyệt vời về điều này trong gói simple-salesforce. Mã này nằm trong số login.py và được dán bên dưới

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)) 
Các vấn đề liên quan