Tôi tự hỏi liệu tôi có thể sử dụng đơn giản chỉ cần sử dụng các yêu cầu HTTP POST để thực hiện một API SOAP.Tôi có thể sử dụng các yêu cầu HTTP Post cho SOAP không? - SOAP và Django
Nếu vậy tôi nên định dạng và xử lý yêu cầu như thế nào?
Tôi tự hỏi liệu tôi có thể sử dụng đơn giản chỉ cần sử dụng các yêu cầu HTTP POST để thực hiện một API SOAP.Tôi có thể sử dụng các yêu cầu HTTP Post cho SOAP không? - SOAP và Django
Nếu vậy tôi nên định dạng và xử lý yêu cầu như thế nào?
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.
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.
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))
Liên kết bị hỏng - chỉ cần hướng lên trên. – alexplanation