2017-07-10 84 views
0

使用Python zeep,我正在與Salesforce的SOAP(特別是元數據)API進行交互。SOAP - 必須指定元素的類型屬性值

試圖createMetadata我得到這個錯誤:

Fault: Must specify a {http://www.w3.org/2001/XMLSchema-instance}type attribute value for the {http://soap.sforce.com/2006/04/metadata}metadata element

我收集了,這是不是傳遞給方法(方法createMetadata參數需要一個metadata的說法,這本身就是一個對象一個fullName字段),而是在某處丟失了xsi:type屬性。

這是我zeep電話:

resp = service['createMetadata'](_soapheaders=soap_headers, 
           metadata=[{'fullName': 'SomeCustomObject'}]) 

這是生成的XML:

<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap-env:Body> 
    <ns0:createMetadata xmlns:ns0="http://soap.sforce.com/2006/04/metadata"> 
     <ns0:metadata> 
     <ns0:fullName>SomeCustomObject</ns0:fullName> 
     </ns0:metadata> 
    </ns0:createMetadata> 
    </soap-env:Body> 
</soap-env:Envelope> 

我的問題是:我怎麼可以設置xsi:type在需要的地方進行設置(即ns0:metadata guy?)使用zeep

UPDATE:

metadata_type = client.get_type('{http://soap.sforce.com/2006/04/metadata}Metadata') 
metadata = metadata_type(fullName='SomeCustomObject') 
resp = service['createMetadata'](_soapheaders=soap_headers, metadata=[metadata]) 

新生成的XML是:

<soap-env:Envelope xmlns:soap-env="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap-env:Body> 
    <ns0:createMetadata xmlns:ns0="http://soap.sforce.com/2006/04/metadata"> 
     <ns0:metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns0:Metadata"> 
     <ns0:fullName>SomeCustomObject</ns0:fullName> 
     </ns0:metadata> 
    </ns0:createMetadata> 
    </soap-env:Body> 
</soap-env:Envelope> 

其具有xsi:type屬性
代替使用字典來表示元數據對象的,我與此替換它在ns0:metadata標記上,但我得到了和以前一樣的錯誤。所以我想這不是關於丟失xsi:type。任何想法是什麼?

回答

1

答案是xsi:type應該使用'CustomObject'(或其他合適的類型),而不是'Metadata',這是「家長」式的,我相信。這也需要通過不止fullName

zeep這意味着不是

metadata_type = client.get_type('{http://soap.sforce.com/2006/04/metadata}Metadata') 
metadata = metadata_type(fullName='SomeCustomObject') 

我用

custom_object_type = client.get_type('{http://soap.sforce.com/2006/04/metadata}CustomObject') 
custom_object = custom_object_type(fullName='SomeCustomObject__c', 
            label='SomeCustomObject', 
            pluralLabel='SomeCustomObjects', 
            nameField={'label': 'name', 'type': 'Text'}, 
            deploymentStatus='Deployed', 
            sharingModel='ReadWrite') 

然後最後:

resp = service['createMetadata'](_soapheaders=soap_headers, 
           metadata=[custom_object]) 
1

在這裏您可以看到,xsi定義在元數據

<metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CustomField"> 
</metadata> 
+0

我不明白。你在暗示什麼? – tscizzle

+0

啊,我明白了。你說的xsi:類型必須是CustomObject或CustomField,或者是來自可接受值的正確集合中的東西,其中元數據不是一個。 – tscizzle

+0

我只是在發佈我的答案後才意識到你的意思,但我還包括瞭解釋(我最初沒有從你的簡短回答中收集)以及示例'zeep'代碼,以使它更加完整。 – tscizzle

相關問題