2017-07-10 7 views
0
an

Unter Verwendung von Python zeep interagiere ich mit der SOAP-API (speziell Metadaten) von Salesforce.SOAP - Geben Sie einen Typ-Attributwert für das Element

zu createMetadata Versuch bekomme ich diesen Fehler:

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

Ich habe gesammelt, dass dies auf die Methode übergeben nicht über Parameter ist (die Art und Weise createMetadata erfordert ein metadata Argument, das selbst ein Objekt ist mit ein fullName Feld), sondern eher über eine fehlende xsi:type Attribut irgendwo.

Das ist mein zeep Aufruf:

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

Dies ist die erzeugte 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> 

Meine Frage ist: Wie kann ich einstellen, dass xsi:type auf, was es braucht eingestellt werden (das ns0:metadata guy?) Mit zeep?

UPDATE:
Statt ein Wörterbuch mit dem Metadatenobjekt darzustellen, habe ich es mit dieser Fassung:

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

Der neue generierte XML ist:

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

, die das xsi:type Attribut auf dem ns0:metadata Tag, aber ich bekomme den gleichen Fehler wie zuvor. Also ich denke es ging nicht um eine fehlende xsi:type. Irgendwelche Ideen, was es ist?

Antwort

1

Die Antwort ist, dass xsi:type'CustomObject' (oder einen anderen geeigneten Typ) verwenden sollte statt 'Metadata', die die „Eltern“ Typ ist, glaube ich. Das erfordert dann auch mehr als nur fullName übergeben.

In zeep, die anstelle von

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

verwendet, bedeutet, ich

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

und dann endlich:

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

Hier können Sie sehen, dass xsi in Metadaten definiert ist.

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

Ich verstehe nicht. Was schlägst du vor? – tscizzle

+0

Ah, ich verstehe. Sie sagen, dass der xsi: type CustomObject oder CustomField oder etwas aus der richtigen Menge von akzeptierten Werten sein muss, von denen Metadaten nicht eins sind. – tscizzle

+0

Ich erkannte erst, was du gesagt hast, nachdem ich meine Antwort gepostet habe, aber ich habe auch die Erklärung (die ich nicht zuerst aus deiner kurzen Antwort gesammelt habe), sowie den Beispielcode "Zeep" hinzugefügt, um es noch vollständiger zu machen. – tscizzle

Verwandte Themen