使用Python zeep,我与Salesforce的SOAP(特别是元数据)API进行交互。
尝试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
设置为需要设置的zeep
家伙??
更新:
我没有使用字典来表示元数据对象,而是将其替换为:
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
。关于它是什么的任何想法?
答案 0 :(得分:1)
您可以在此处看到 xsi 在元数据中定义。
<metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CustomField">
</metadata>
答案 1 :(得分:1)
答案是xsi:type
应该使用'CustomObject'
(或其他合适的类型)而不是'Metadata'
,这是&#34;父母&#34;类型,我相信。这也需要传递的不仅仅是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])