Каковы параметры для метода Salesforce WebServiceCallout.invoke?
Я хотел бы знать параметры для метода invoke, используемого Salesforce для вызова удаленных веб-сервисов. У меня есть служба, которую я должен вызывать, но служба WSDL не определяет требования безопасности, поэтому я надеюсь, что смогу добавить эту информацию вручную (службы используют WS-Security, пропущенный через заголовки Soap).
Вот что я (думаю, я) знаю до сих пор:
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
);
Кто-нибудь может помочь заполнить пробелы?
2 ответа
Вот что я обнаружил для WebServiceCallout.invoke:
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
}
Кроме того, заголовки Soap могут быть вставлены путем создания объекта в классе servicePort, а также строки с тем же именем переменной +"_hns", которая задает пространство имен для этого объекта:
public SoapSecurity Security;
private String Security_hns = "Security=http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
Объекты apex XML Schema должны содержать переменные для каждого дочернего элемента (или атрибута). Массивы, имена переменных которых соответствуют определенным шаблонам, определяют, как переменные объекта используются в xml.
Дан следующий пример XML:
<foo a="b"><bar>baz</bar></foo>
Классы Apex будут примерно такими:
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'};
}
}
Вот (краткая) разбивка этих объектов:
Если переменная представляет другой элемент XML или текстовый узел, то должна быть соответствующая _type_info String[], например bar_type_info. Элементы этого массива: 1. Имя элемента XML 2. Схема 3. Тип XML 4. minOccurs 5. maxOccurs (значение "-1" для неограниченного) 6. isNillable
Если переменная представляет атрибут, то должна быть соответствующая строка _att_info [], например, a_type_info. Thise просто содержит XML-имя атрибута.
Обратите внимание, что если имя переменной класса является зарезервированным словом, к нему добавляется _x, например bar_x. Это повлияет на имена других переменных: bar_x_type_info. Руководство разработчика Apex объясняет их правила для имен, но если вы создаете его вручную, я думаю, вы можете дать ему любое имя - массивы определяют имя элемента XML...
Я не нашел способ представления простого типа XML, который также содержит атрибут: например,
<foo bar="baz">bar</foo>
Массив apex_schema_type_info определяет информацию об элементе XML, представленном классом: 1. Схема 2. "Истина", если elementFormDefault="квалифицированный" 3. "Истина", если attributeFormDefault="квалифицированный"
Я все еще не совсем понимаю, что на самом деле делают 2 и 3, но, похоже, это влияет на то, как дочерние элементы (и атрибуты) наследуют родительское пространство имен (подразумевается ли оно или должно быть указано в результирующем XML).
field_order_type_info просто указывает порядок дочерних элементов.
Пожалуйста, не стесняйтесь исправить или уточнить...
Существует Руководство для разработчиков Apex-кода Force.com - Понимание сгенерированного кода, но в настоящее время в нем довольно мало деталей для WebServiceCallout.invoke(...)
,
Также есть Apex Web Services и Callouts, опять же никаких полезных подробностей.
Идеи с предварительным голосованием : документация для WebServiceCallout может помочь в долгосрочной перспективе.
Salesforce только что выпустили версию wsdl2apex с открытым исходным кодом на Github, поэтому теперь вы можете проверить код, чтобы точно узнать, что происходит. Объявление о генераторе WSDL2Apex с открытым исходным кодом