Каковы параметры метода 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
);

Может ли кто-нибудь помочь заполнить пробелы?

Ответ 1

Вот что я обнаружил до сих пор для 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";

Объекты XML-схемы вершины должны содержать переменные для каждого дочернего элемента (или атрибута). Массивы, имена переменных которых соответствуют определенным шаблонам, определяют, как переменные объекта используются в 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 или текст node, тогда должна быть соответствующая строка _type_info String [], например. bar_type_info. Элементы этого массива: 1. Имя XML-элемента 2. Схема 3. Тип XML 4. minOccurs 5. maxOccurs (установлен для "-1" для неограниченного) 6. isNillable

Если переменная представляет атрибут, тогда должна быть соответствующая строка _att_info String [], например. a_type_info. Это просто содержит XML-атрибут атрибута.

Обратите внимание, что если имя переменной класса является зарезервированным словом, к нему добавляется _x, например. bar_x. Это повлияет на имена других переменных: bar_x_type_info. Руководство разработчика Apex объясняет свои правила для имен, но если вы его вручную создаете, я думаю, вы можете дать ему любое имя, которое вы хотите - массивы определяют имя XML-элемента...

Я не нашел способ представления простого типа XML, который также содержит атрибут: например,

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

В массиве apex_schema_type_info задается информация об элементе XML, представленном классом: 1. Схема 2. "true", если elementFormDefault = "квалифицированный" 3. "true", если атрибутFormDefault = "квалифицированный"

Я по-прежнему довольно нечеткий, что на самом деле делают 2 и 3, но, похоже, влияет на то, как дочерние элементы (и атрибуты) наследуют родительское пространство имен (подразумевается ли оно или должно быть указано в результирующем XML).

field_order_type_info просто задает порядок дочерних элементов.

Пожалуйста, не стесняйтесь исправить или уточнить...

Ответ 2

Существует Force.com Apex Code Developers Guide - Понимание генерируемого кода, но в настоящее время он довольно редок для деталей WebServiceCallout.invoke(...).

Существует также Apex Web Services и Callouts, опять же не какие-либо полезные данные.

Up-vote Идеи: Документация для WebServiceCallout может помочь в долгосрочной перспективе.


Salesforce только что выпустила версию wsdl2apex с открытым исходным кодом на Github, поэтому теперь вы можете проверить код, чтобы точно увидеть, что происходит. Объявление генератора WSDL2Apex с открытым исходным кодом