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 ответа
Я вижу два разных вопроса, попробую ответить на оба.
- "Должны ли они выйти и обновить себя?". Нет, они этого не делают, вы можете запустить обновление: https://developer.salesforce.com/docs/atlas.en-us.packagingGuide.meta/packagingGuide/push_upgrade_intro.htm
- "Как мы можем сделать это обратно совместимым?". Разве вы не можете сохранить старый метод для трех входных параметров и создать новый для четырех?
Труднее дать ответ без какого-либо конкретного кода.
Есть разные способы сделать это.
Во-первых, управление версиями.@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 пуст, он не был передан. Используя этот метод, вам нужно будет выполнить проверку ввода. Например, это примет нулевые параметры, и все элементы будут пустыми.