Salesforce REST API с управляемым пакетом

Мы внедрили услугу отдыха в управляемом пакете. Несколько наших клиентов уже установили этот пакет. В настоящее время требуется 3 параметра. Цель - отправить обновления, сделанные в одной системе, в экземпляр Salesforce с установленным управляемым пакетом. При создании этого сервиса мы следовали приведенным здесь примерам...

https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_rest_methods.htm

Мы хотим добавить необязательный параметр к нашему вызову метода POST. Например, перейдите от 3 параметров к 4. Мы хотим, чтобы это изменение было обратно совместимым. То, что мы видим при попытке проверить это, является ошибкой "Ресурс не найден" при отправке 4 параметров, а не старых 3 параметров.

Можно ли просто обновить код обслуживания остальных, не заставляя всех наших клиентов снова установить пакет? Или кто-нибудь, кто установил управляемый пакет, должен выйти и получить новый пакет, чтобы прочитать новый параметр? Каков наилучший способ управления такими изменениями или обновлениями?

Есть ли лучшая реализация или способ справиться с этим сценарием? Ответственность за определение установленной версии API/ пакета и передачу трех или четырех параметров лежит на ответственном за нее.

Если вы можете поделиться передовым опытом по обновлению реализации метода REST API в рамках Salesforce, это действительно приветствуется.

Пример Old Way: ../apex/updateSomething, отправленный с json в теле {"Element1":"Value1","Element2":"Value2","Element3":"Value3"}

Пример New Way: ../apex/updateSomething, отправленный с json в теле {"Element1":"Value1","Element2":"Value2","Element3":"Value3","Element4":"Value4"}

2 ответа

Я вижу два разных вопроса, попробую ответить на оба.

  1. "Должны ли они выйти и обновить себя?". Нет, они этого не делают, вы можете запустить обновление: https://developer.salesforce.com/docs/atlas.en-us.packagingGuide.meta/packagingGuide/push_upgrade_intro.htm
  2. "Как мы можем сделать это обратно совместимым?". Разве вы не можете сохранить старый метод для трех входных параметров и создать новый для четырех?

Труднее дать ответ без какого-либо конкретного кода.

Есть разные способы сделать это.

Во-первых, управление версиями.
@RestResource(urlMapping = '/DemoEndpoint/v1/*')

Добавив v1, ваши конечные пользователи могут использовать разные версии и обновиться до более новых версий, когда они будут готовы. Следующая версия может быть
@RestResource(urlMapping = '/DemoEndpoint/v2/*')

Управление версиями рекомендуется для конечных точек API. Вам нужно будет создать отдельные классы для каждой версии.

Второй способ - изменить способ приема входных параметров. В этом сценарии удалите входные параметры в определении метода и используйте Request.requestbody.

Это оригинальный код (при условии, что вы следовали примеру руководства разработчика)
@HttpPost global static void myPostMethod(string Element1, string Element2, string Element3, string Element4)

Новый код, принимающий 3 или 4 параметра (или 0 параметров, см. Примечание ниже).

@HttpPost
global static string myPostMethod() {
    RestRequest request = RestContext.request;
    String body = request.requestBody.toString();
    List<Wrapper> obj = (List<Wrapper>) JSON.deserialize(body, List<Wrapper>.Class);

Класс-обёртка будет

public class Wrapper{
    string Element1;
    string Element2;
    string Element3;
    string Element4;
}

Если Element4 пуст, он не был передан. Используя этот метод, вам нужно будет выполнить проверку ввода. Например, это примет нулевые параметры, и все элементы будут пустыми.

Другие вопросы по тегам