Вы находитесь здесь:
Использование Apex для создания асинхронной выноски во внешнюю службу
При регистрации схемы, содержащей обратный вызов, внешние службы создают вызываемую операцию Apex с автоматически созданным классом Apex. Salesforce создает URL-адрес обратного вызова для асинхронной выноски (исходная выноска), доступной только для чтения. Создайте клиента Apex, способного обработать обратный вызов, используя созданные интерфейсы Apex. Клиент ожидает асинхронного ответа от внешней системы в течение длительного времени (до 24 часов).
Дополнительную информацию см. в разделе «Новые связанные приложения больше не могут быть созданы в выпуске Spring ‘26».
Ниже указаны предварительные параметры и настройки, которые нужно выполнить перед созданием собственной асинхронной выноски.
- Просмотрите фиктивную схему, на которой основаны примеры асинхронных обратных вызовов. См. Пример характеристики API с операцией обратного вызова.
- Для проверки подлинности и создания запросов Определение внешних регистрационных данных и именованных регистрационных данных.
- Чтобы получить асинхронный ответ, создайте связанное приложение, как описано в разделе Авторизация посредством связанных приложений и OAuth 2.0. Конечные точки обратного вызова Salesforce Platform открываются посредством TLS в Connect API. Абонент должен авторизоваться в организации Salesforce, настроив соответствующее связанное приложение.
- Зарегистрируйте спецификацию API, используя обычный бизнес-правило, как описано в разделе Регистрация внешней службы.
Для сравнения, синхронная выноска обычно выглядит следующим образом:
ExternalService.AcmeMortgages acme = new ...();
ExternalService.AcmeMortgages.GetApplication_Request request = new ...();
request.applicationNumber = 'X202290';
ExternalService.AcmeMorgages.GetApplication_Response response =
acme.GetApplication(request);
ExternalService.AcmeMortgages_MortgageApplication application = response.Code200;Чтобы вызвать асинхронный вызов, необходимо написать собственный код Apex для выполнения вызова. Потом необходимо внедрить собственный объект обратного вызова и передать его в метод асинхронного вызова в коде Apex.
Обработчик обратного вызова должен быть без гражданства. Salesforce не сохраняет сведения о состоянии при обратном вызове ответа.
Не вкладывайте класс обратного вызова. Класс обратного вызова должен внедрить интерфейс обратного вызова напрямую. Например:
- Правильно:
MyCallbackкласса расширяетES.ServiceName.OperationName_Callback {...} - Не рекомендуется:
SomeIntermediateClassкласса продлеваетES.ServiceName.OperationName_Callback {...}, а потомMyCallbackпродлеваетSomeIntermediateClass {...}
- Введите строку «Классы Apex» в поле «Быстрый поиск» в меню «Настройка» и выберите пункт «Классы Apex».
- Найдите класс Apex, содержащий нужный интерфейс обратного вызова.
- Создайте обратный вызов. Напишите объект обратного вызова Apex, реализующий созданный внешними службами интерфейс обратного вызова посредством ссылки на соответствующий класс Apex.
- После получения определения обратного вызова передайте этот обратный вызов в метод асинхронного вызова в коде Apex.
// The callback gets called with the mortgage application update
// and handles each outcome, for example application is approved, rejected, ...
global class MyMortgageApplicationCallback extends ExternalService.AcmeMortgage.SubmitApplication_Callback {
// Application approved
global override void applicationOutcomeApproved(
List<ExternalService.AcmeMortgages.SubmitApplication_applicationOutcomeApproved_Callback> callbacks) {
ExternalService.AcmeMortgages.SubmitApplication_applicationOutcomeApproved_Callback callback = callbacks.get(0);
if (callback.callbackStatus == CallbackStatus.COMPLETED) {
Double loanAmount = callback.response.body.approvedAmount;
// Create a Contact based on the response ...
}
}
// Application rejected
global override void applicationOutcomeRejected(...) {...}
...
}
public class MyMortgageApplicationProcess {
public void submitApplication(...) {
// Submit mortgage application process
ExternalService.AcmeMortgages acme = new ...();
ExternalService.AcmeMortgages.SubmitApplication_Request request = new ...();
ExternalService.AcmeMortgages_Contact applicant = new ...();
applicant.Name = 'Joe Miller';
applicant.Address = '555 Miller St, CA, Milltown';
request.applicant = applicant;
// Time out if no response after 1 day
DateTime timeout = DateTime.now().addDays(1);
ExternalService.AcmeMorgages.SubmitApplication_Response response =
acme.SubmitApplication(request, new MyMortgageApplicationCallback(), timeout);
// Get back application number immediately
String appNr = response.Code201.applicationNumber;
// Get invocationId from a successful initial response to check status of the background operation
String invocationId = response.invocationId;
...
}
}

