0

使用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。关于它是什么的任何想法?

4

2 回答 2

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])
于 2017-07-11T15:35:01.403 回答
1

在这里您可以看到xsi是在metadata中定义的。

<metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CustomField">
</metadata>
于 2017-07-10T19:12:31.307 回答