2016-08-26 13 views
1

しばらくの間、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

答えて

2

、あなたは何を返却する必要がありますすなわち、etree.tostring(ルート)

def build_xml(self): 
     root = etree.Element(
      "{soapenv}Envelope", 
      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 
     return etree.tostring(root) 

あなたのヘッダーを変更することもできます= {'Content-Type':'text/xml'}

+0

ありがとう、これはこれをクリアしたようです!しかし、別のSOAPエラーが発生しています。 <?xml version = "1.0" encoding = "UTF-8"?> soapenv:VersionMismatch SOAPリクエストはSOAP 1.1を使用する必要があり、ドキュメントルートとしてSOAP 1.1エンベロープを受信しませんでした。 Envelope''' –

+0

このトピックに関する新しい質問を開始しました:http://stackoverflow.com/questions/39183423/the-soap-request-must-use-soap-1-1 –

関連する問題