2010-12-08 10 views
11

Ich möchte die Parameter für die Aufrufmethode kennen, die von Salesforce zum Aufrufen von Remotewebdiensten verwendet wird. Ich habe einen Dienst, den ich aufrufen kann, aber der Dienst WSDL definiert die Sicherheitsanforderungen nicht, also hoffe ich, dass ich diese Informationen manuell hinzufügen kann (Die Dienste verwenden WS-Sicherheit, die durch Soap-Header übergeben wird).Welche Parameter gibt es für die Salesforce WebServiceCallout.invoke-Methode?

Hier ist, was ich (glaube ich) weiß so weit:

WebServiceCallout.invoke(
    Class servicePort, //Usually set to "this", contains httpheader info as well as ? 
    request_x, //Request object, defining schema, properties, and field order 
    response_map_x, //Response object, defining schema, properties, and field order 
    new String[]{ 
    String endpoint, //Endpoint of the service 
    String ?, //what is this? 
    String methodSchema, //Schema for the request object? 
    String method, //Name of the request method? 
    String responseSchema, //Schema for the response object? 
    String response, //Name of the response object? 
    String responseClass} //Name of the Apex class the response will be converted to 
); 

Kann jemand in die Lücken helfen füllen?

Antwort

16

Hier ist, was ich bisher für WebServiceCallout.invoke entdeckt habe:

Object servicePort - A class with the following variables: 
    String enpoint_x: containing the service endpoint (not sure if necessary) 
    Map<String,String> inputHttpHeaders_x: custom httpHeaders 
    Map<String,String> outputHttpHeaders_x: I think this is the httpHeaders that were returned 
    String clientCertName_x: Used in configuring an SSL cert? 
    String clientCert_x: Used in configuring an SSL cert? 
    String clientCertPassword: Used in configuring an SSL cert? 
    Integer timeout_x: How long (in milliseconds?) to wait for the response 
    String[] ns_map_type_info: The first String is the namespace of the service schema, the second is the name of the object that contains the Apex classes defining the schema objects 
Object request_x - The Apex object that will form the XML schema object 
Map<String, Object> response_map_x - Object is the object that the result is to be unserialized into. String is the name of Object variable. 
String[] { 
    endpoint - The service endpoint 
    soapAction - If the service call requires a soapAction, put it here. Otherwise leave blank. 
    methodSchema - Schema for the request object 
    method - Name of the request method 
    responseSchema Schema for the response 
    responseClass The Apex class that the response will be unserialized into 
} 

Zusätzlich Soap-Header, indem ein Objekt in der Serviceport-Klasse sowie einen String mit dem gleichen Variablennamen eingefügt werden können + "_hns", die den Namensraum für das Objekt angibt:

public SoapSecurity Security; 
private String Security_hns = "Security=http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"; 

die apex XML Schema Objekte Variablen für jedes untergeordnete Element (oder Attribute) enthalten sollte. Arrays, deren Variablennamen bestimmten Mustern entsprechen, definieren, wie die Objektvariablen in der XML-Datei verwendet werden.

das folgende Beispiel XML Gegeben:

<foo a="b"><bar>baz</bar></foo> 

Die Apex-Klassen so etwas wie dieses würde:

public class MyService { 
    public class bar { 
     public String bar; 
     private String[] bar_type_info = new String[] {'bar','http://www.w3.org/2001/XMLSchema','string','0','1','true'}; 
     private String[] apex_schema_type_info = new String[] {'http://schema.myservice.com', 'false', 'false'}; 
     private String[] field_order_type_info = new String[] {'bar'}; 
    } 

    public class foo { 
     public MyService.bar bar; 
     public String a; 
     private String[] bar_type_info = new String[] {'bar','http://schema.myservice.com','bar','0','1','true'}; 
     private String[] a_att_info = new String[] {'a'}; 
     private String apex_schema_type_info = new String[] {'http://schema.myservice.com','false','false'}; 
     private String[] field_order_type_info = new String[] {'bar'}; 
    } 
} 

Hier ist eine (kurze) Aufschlüsselung dieser Objekte:

Wenn die Variable stellt ein anderes XML-Element oder einen Textknoten dar, dann muss ein passender _type_info String [] zB bar_type_info. Die Elemente dieses Arrays sind: 1. XML element name 2. Schema 3. XML Typ 4. minOccurs 5. maxOccurs (auf '-1' für unbeschränkte) 6. isNillable

Wenn die Variable stellt ein Attribut dar, dann muss ein passender _att_info String [] zB sein a_type_info. Thise enthält einfach den XML-Namen des Attributs.

Beachten Sie, dass, wenn ein Klassenvariablenname ein reserviertes Wort ist, _x daran angehängt wird, z. bar_x. Dies würde sich auf die anderen Variablennamen auswirken: bar_x_type_info. Das Apex-Entwicklerhandbuch erklärt ihre Regeln für Namen, aber wenn Sie es manuell erstellen, denke ich, dass Sie ihm den gewünschten Namen geben können - die Arrays bestimmen den Namen des XML-Elements ...

Ich habe keinen Weg gefunden um einen einfachen XML-Typ darzustellen, der auch ein Attribut enthält: z

<foo bar="baz">bar</foo> 

Die apex_schema_type_info Array angibt Informationen über die XML-Element durch die Klasse repräsentiert: 1. Schema 2. 'wahr', wenn ElementFormDefault- = "qualifiziert" 3.'true' wenn attributeFormDefault = "qualified"

Ich bin immer noch ziemlich unscharf auf was 2 und 3 tatsächlich tun, aber es scheint zu beeinflussen, wie untergeordnete Elemente (und Attribute) den übergeordneten Namespace erben (ob es impliziert ist oder sein muss) in der resultierenden XML-Datei angegeben).

field_order_type_info gibt einfach die Reihenfolge der untergeordneten Elemente an.

Bitte fühlen Sie sich frei zu korrigieren oder zu klären ...

+0

Haben Sie einen Weg gefunden, den ' Balken'Anfrage XML zu generieren? @ Jeremy – Jair

+0

Ich fürchte nicht. Ich arbeite derzeit nicht an der Salesforce-Integration. Ich schätze, das wurde angesprochen, aber ich weiß es wirklich nicht. – Jeremy

+0

Danke. Ich denke, es ist immer noch Existenz. – Jair

5

Es ist die Force.com Apex Code Developers Guide - Understanding the Generated Code, aber es ist noch ziemlich spärlich auf Details für WebServiceCallout.invoke(...).

Es gibt auch Apex Web Services and Callouts, wieder keine nützlichen Details.

Up-voting Ideas: Documentation for WebServiceCallout kann auf lange Sicht helfen.


Salesforce hat gerade eine Open-Source-Version von wsdl2apex auf Github getan, so dass Sie jetzt Code überprüfen können, genau zu sehen, was auftritt. Announcing the Open-Source WSDL2Apex Generator

Verwandte Themen