しばらくの間、Salesforce REST APIを正常に使用しましたが、SOAP APIを介してのみ利用可能ないくつかの機能があります。このような関数の1つがconvertLead()関数です。私は、Salesforce Access Token(a/k/a Session ID)を使用してSOAP APIを呼び出すことができるはずだと考えていますが、この機能に使用するライブラリはもちろん、興味メートルSalesforce SOAP APIで使用するためのXMLの生成
SalesforceはここにサンプルSOAPリクエスト提供:https://developer.salesforce.com/page/Enterprise_Convert_Lead
私はいくつかのconvertLead()関数を記述しようとしましたが、いくつかのエラーに実行してきたが、私はだけでなく、SOAPに新たなんだので、 lxmlライブラリ、私は診断する方法がわかりません。以下のように、私はlead_idとSESSION_ID(アクセストークン)の値を渡すことができるように
from lxml import etree
class SalesforceLeadConverter(object):
def __init__(self, session_id, lead_id, **kwargs):
self.session_id = session_id
self.lead_id = lead_id
def build_xml(self):
root = etree.Element(
"{soapenv}Envelope",
soapenv='<a rel="nofollow" class="external free" href="http://schemas.xmlsoap.org/soap/envelope/">http://schemas.xmlsoap.org/soap/envelope/</a>',
urn="urn:enterprise.soap.sforce.com"
)
soapenv = etree.SubElement(root, "{soapenv}Header")
urn = etree.SubElement(soapenv, "{urn}SessionHeader")
session_id = etree.SubElement(urn, "{urn}sessionId").text=self.session_id
soapenv2 = etree.SubElement(root, "{soapenv}Body")
urn2 = etree.SubElement(soapenv2, "{urn}convertLead")
lead_converts = etree.SubElement(urn2, "{urn}leadConverts")
lead_id = etree.SubElement(lead_converts, "{urn}leadId").text=self.lead_id
print(etree.tostring(root, pretty_print=True))
return root
これは設計されており、いくつかのXMLを生成します。ここでは
は、私はXMLを生成するために書いたクラスでありますそう:<ns0:Envelope xmlns:ns0="soapenv" urn="urn:enterprise.soap.sforce.com">
<ns0:Header>
<ns1:SessionHeader xmlns:ns1="urn">
<ns1:sessionId>1q2w3e4r...</ns1:sessionId>
</ns1:SessionHeader>
</ns0:Header>
<ns0:Body>
<ns2:convertLead xmlns:ns2="urn">
<ns2:leadConverts>
<ns2:leadId>00Qj000000PMV3h</ns2:leadId>
</ns2:leadConverts>
</ns2:convertLead>
</ns0:Body>
</ns0:Envelope>
最後に、私は合格し、次の出力を生成し
>>> from integrations.salesforce.soap import SalesforceLeadConverter
>>> slc = SalesforceLeadConverter(session_id="1q2w3e4r...", lead_id="00Qj000000PMV3h")
>>> xml = slc.build_xml()
requests
を使用してXMLデータをSalesforce SOAP APIエンドポイントに送信します。私はanother threadのために 'SOAPAction'に任意の値(この場合 'x')を設定しました。これをいくつかのランダムなテキスト値に設定することを推奨しました。私は次のエラーを取得しています
>>> headers = {'Content-Type':'application/xml', 'SOAPAction':'x'}
>>> requests.post('https://na1.salesforce.com/services/Soap/c/10.0', data=xml, headers=headers)
:
TypeError: data must be a memoryview, buffer or byte string
フル・エラー出力はここにある:あなたがElementオブジェクトであるルートを渡しているhttps://gist.github.com/joefusaro/f3297c253beb6bba93e075d8b8da9822
ありがとう、これはこれをクリアしたようです!しかし、別のSOAPエラーが発生しています。 <?xml version = "1.0" encoding = "UTF-8"?> soapenv:Fault> soapenv:Body> soapenv:Fault> soapenv:VersionMismatch SOAPリクエストはSOAP 1.1を使用する必要があり、ドキュメントルートとしてSOAP 1.1エンベロープを受信しませんでした。 Envelope''' –
このトピックに関する新しい質問を開始しました:http://stackoverflow.com/questions/39183423/the-soap-request-must-use-soap-1-1 –