Как сделать httpsrequest 'Get' в apex и затем обновить запись в Salesforce - PullRequest
0 голосов
/ 05 февраля 2020

Обзор:

У нас есть сторонняя организация, которая размещает текстовое значение в данной конечной точке. Используя запрос Get к URL-адресу, где мы также передаем ключ, а параметры возвращают строковые значения (десятичных чисел и пробела). Я создал некоторый апекс-код, в том числе @InvocableMethod, чтобы я мог все апексы из потока, где я передаю в URL, а затем текст возвращается в поток. Я тогда go, чтобы обновить запись. Вот этот метод, есть также класс FR_Amount_Variables, хранящий значения URL и String @InvocableVariable.

public class FR_Amount_Sync {
  @InvocableMethod(label='FR Amount Raised Get')  
    public static List<FR_Amount_Variables>getFRamount (List<FR_Amount_Variables> inputURL) {
        FR_Amount_Variables amtvar = new FR_Amount_Variables();
        List<FR_Amount_Variables> getFRamount = new List<FR_Amount_Variables>();

        string endpoint = inputURL[0].URL;
        Http http = new Http();
        HttpRequest request = new HttpRequest();
        request.setEndpoint(endpoint);
        request.setMethod('GET');
    HttpResponse response = http.send(request);
        string Amounts= response.getBody();
         Amounts= Amounts.replaceAll( '\\s+', '');
        if(String.isEmpty(Amounts)){
             Boolean isEmpty = true;
         Amounts = '0.00';
        }
       decimal amountss = decimal.valueOf(Amounts);
        amtvar.amount = amountss;
            getFRamount.add(amtvar);
        return getFRamount;
}  
}

Изображение потока можно увидеть ниже Обновление потока

Проблема:

Когда я запускаю поток в режиме отладки, задаю 3 входные переменные и запускаю, поток выполняет апекс и корректно обновляет указанную запись. Точно так же, если я предварительно настрою входные переменные потока (добавлю значение по умолчанию) и просто запущу поток, обновления вершины и записи завершатся успешно с обновлением записи с правильным значением от стороннего производителя. Проблема в том, что когда я пытаюсь автоматически запустить поток, либо с помощью Process Builder, либо с помощью Mass Action Scheduler, я получаю системные исключения. Произошла ошибка Apex:

System.CalloutException: You have uncommitted work pending. Please commit or rollback before calling out

и

An Apex error occurred: System.CalloutException: Callout loop not allowed

соответственно.

Мне было интересно, есть ли в любом случае, чтобы вызвать поток, который не вызывает ошибку. В противном случае есть способ, которым я могу сделать выноску httprequest 'get' и затем обновить запись полученной записью.

1 Ответ

0 голосов
/ 16 апреля 2020

Мы не можем сделать DML до Callout в той же транзакции. DML может быть сделано после Callout. Итак, лучшая практика - делать Callout, используя метод будущего. Таким образом, поток будет обрабатывать операции DML.

Например, проверьте эту ссылку - https://www.infallibletechie.com/2020/04/how-to-do-callout-from-flow-in.html

...