代码之家  ›  专栏  ›  技术社区  ›  tscizzle

SOAP-必须为元素指定类型属性值

  •  0
  • tscizzle  · 技术社区  · 7 年前

    使用 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

    创建元数据 需要 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>
    

    在任何需要设置的地方(即 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])
    

    <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>
    

    哪个有 ns0:元数据 标记,但我得到了与之前相同的错误。所以我想这不是关于失踪 .有什么想法吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Jignesh Jarsaniya    7 年前

    南印第安湖 元数据

    <metadata xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CustomField">
    </metadata>
    
        2
  •  1
  •   tscizzle    7 年前

    答案是 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])