Как определить среду в Salesforce?
Я интегрирую наши задние системы с Salesforce, используя веб-службы. У меня есть производственные и сценические среды, работающие на разных URL-адресах. Мне нужно иметь возможность, чтобы конечная точка вызова веб-службы была различной в зависимости от того, выполняется ли код в экземпляре Salesforce для производства или в виде песочницы.
Как определить среду.
В настоящее время я рассматриваю поиск пользователя, чтобы узнать, заканчивается ли имя пользователя в 'devsandbox', поскольку мне не удалось идентифицировать системный объект, который я могу запросить, чтобы получить среду.
Дальнейшие разъяснения:
Место, которое мне нужно определить, это код Apex, который вызывается, когда я выбираю кнопку в Salesforce. Мой пользовательский контроллер должен знать, работает ли он в среде Salesforce для производства или изолированной среды.
Ответы
Ответ 1
Чтобы найти это через результаты поиска, есть важное обновление. Как отметил Даниэль Хехст в еще одном сообщении, SF теперь напрямую предоставляет песочницу и информацию о производстве:
Летом '14 (версия 31.0) есть новое поле, доступное на Объект организации.
выберите Id, IsSandbox из ограничения организации 1
Из примечаний к выпуску в разделе "Новые" и "Изменить объекты":
The Organization object has the following new read-only fields.
InstanceName
IsSandbox
Ответ 2
На основе ответов выясняется, что Salesforce не имеет системного объекта, который может сказать мне, работает ли мой код Apex в производстве или среда песочницы.
Я собираюсь продолжить, основываясь на следующих предположениях:
- Я могу прочитать идентификатор организации текущей среды
- Идентификатор организации моей производственной системы всегда будет оставаться постоянным.
- Идентификатор организации песочницы всегда будет отличаться от производства (поскольку они уникальны)
Текущий идентификатор организации можно найти с помощью System.getOrganizationId()
Мое решение состоит в том, чтобы мой код сравнивал текущий идентификатор org с постоянным значением, представляющим продукцию.
Ответ 3
Я выполняю некромантию здесь, и ответ уже принят, но, возможно, кто-то выиграет от этого...
Используйте одно из этих полей слияния на странице Visualforce/S-Control:
{!$Api.Enterprise_Server_URL_180}, {!$Api.Partner_Server_URL_180}, {!$Api.Session_ID}
Вы можете легко разобрать идентификатор организации из них.
В коде Apex: UserInfo.getOrganisationId()
Ответ 4
Я знаю, что это старый пост, но только для людей, которые ищут обновленный ответ по версии Spring '11, появился новый метод System.URL.getSalesforceBaseUrl(). toExternalForm(), который возвращает текущий URL-адрес.
Вы можете работать оттуда, чтобы получить всю необходимую информацию.
Здесь ссылка на документы: http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_url.htm
Ответ 5
Вызов API Login возвращает элемент sandbox в возвращенной структуре LoginResult, которая указывает, является ли его среда изолированной среды или нет, из WSDL.
<complexType name="LoginResult">
<sequence>
<element name="metadataServerUrl" type="xsd:string" nillable="true"/>
<element name="passwordExpired" type="xsd:boolean" />
<element name="sandbox" type="xsd:boolean"/>
<element name="serverUrl" type="xsd:string" nillable="true"/>
<element name="sessionId" type="xsd:string" nillable="true"/>
<element name="userId" type="tns:ID" nillable="true"/>
<element name="userInfo" type="tns:GetUserInfoResult" minOccurs="0"/>
</sequence>
</complexType>
Ответ 6
Песочницы могут иметь персональный url (например, acme.cs1.my.salesforce.com) или могут размещать страницу visualforce (cs2.visual.force.com) или оба (acme.cs2.visual.force.com), поэтому я использую этот метод:
public static Boolean isRunningInSandbox() {
String s = System.URL.getSalesforceBaseUrl().getHost();
return (Pattern.matches('(.*\\.)?cs[0-9]*(-api)?\\..*force.com',s));
}
Ответ 7
Я думаю, что самый простой способ сделать это - создать пользовательский объект в Salesforce, а затем сохранить значение, обозначающее песочницу или производство там. Затем ваш код Apex может запросить этот объект. Одним из предложений было бы использовать статические конструкторы Apex для загрузки этой информации и кэширования ее для запроса.
Еще одна мысль, которую я (но ненавижу предлагать), - использовать внешнюю службу, чтобы определить, где выполняется ваш код Apex. Это, вероятно, будет сложно осуществить, так как каждый раз, когда изменяется ферма серверов SalesForce, происходит изменение вашего кода, но я просто подумал, что я его выброшу.
HttpRequest req = new HttpRequest();
req.setEndpoint('http://www.whatismyip.com/automation/n09230945.asp');
req.setMethod('GET');
Http http = new Http();
HTTPResponse res = http.send(req);
System.debug(res.getBody());
Вы должны добавить " http://www.whatismyip.com" к настройкам удаленного сайта, чтобы заставить это работать (Setup > Administration Setup > Security Controls > Настройки удаленного сайта). Этот код должен запускаться в окне отладки, когда вы нажимаете "Системный журнал".
Ответ 8
В вашем коде вершины вы можете использовать следующее, чтобы получить экземпляр SF, в котором вы находитесь.
Сохраняя динамичность, убедитесь, что вам не нужно обновлять свой код, когда ваша организация переносится в другой экземпляр.
String s = System.URL.getSalesforceBaseUrl().getHost();
//this will return "na1.salesforce.com" or "na1-api.salesforce.com",
// where na1 is your instance of SF, and -api may be there depending on where you run this
s = s.substring(0,s.indexOf('.'));
if(s.contains('-'))
{
s = s.substring(0,s.indexOf('-'));
}
system.debug(s);
Ответ 9
Есть аналогичный вопрос в Salesforce StackExchange для обнаружения, если вы находитесь в песочнице или нет - Можем ли мы определить, является ли экземпляр Salesforce производственной организацией или Sandbox org?
В решениях для поиска категории проблем вы можете использовать идентификатор модуля из OrgId, чтобы определить, имеете ли вы дело с песочницей.
string podId = UserInfo.getOrganizationId().substring(3,4);
boolean isSandbox = 'TSRQPONMLKJZVWcefg'.contains(podId);
System.debug('IsSandbox: ' + isSandbox);
Контекст Caveat:. Большая слабость заключается в том, что вам нужно будет обновить список значков "песочницы", когда и когда Salesforce будет предлагать новые онлайн (так что это может быть более безопасно с другими решениями),
Ответ 10
Вы можете использовать следующий блок кода от Майкла Фаррингтона, уполномоченного на Salesforce.
Оригинальная запись в блоге: Майкл Фаррингтон: Где я?
Этот метод вернет true, если вы находитесь в тестовой среде или в среде песочницы, а false - в противном случае.
public Static Boolean isSandbox(){
String host = URL.getSalesforceBaseUrl().getHost();
String server = host.substring(0,host.indexOf('.'));
// It easiest to check for 'my domain' sandboxes first
// even though that will be rare
if(server.contains('--'))
return true;
// tapp0 is a unique "non-cs" server so we check it now
if(server == 'tapp0')
return true;
// If server is 'cs' followed by a number it a sandbox
if(server.length()>2){
if(server.substring(0,2)=='cs'){
try{
Integer.valueOf(server.substring(2,server.length()));
}
catch(exception e){
//started with cs, but not followed by a number
return false;
}
//cs followed by a number, that a hit
return true;
}
}
// If we made it here it a production box
return false;
}