Как определить среду в Salesforce? - PullRequest
16 голосов
/ 02 октября 2009

Я интегрирую наши серверные системы с Salesforce с помощью веб-сервисов. У меня есть производственные и сценические среды, работающие по разным URL-адресам. Мне нужно, чтобы конечная точка вызова веб-службы отличалась в зависимости от того, выполняется ли код в производственном или изолированном программном средстве Salesforce.

Как определить окружающую среду.

В настоящее время я рассматриваю возможность поиска пользователя, чтобы узнать, оканчивается ли имя пользователя на «devsandbox», поскольку я не смог определить системный объект, к которому я могу обратиться, чтобы получить среду.

Дополнительные уточнения:

Местоположение, которое мне нужно определить, находится внутри кода Apex, который вызывается при выборе кнопки в Salesforce. Мой пользовательский контроллер должен знать, работает ли он в рабочей среде или среде песочницы Salesforce.

Ответы [ 10 ]

13 голосов
/ 08 октября 2014

Для того, чтобы вы нашли это в результатах поиска, есть важное обновление. Как отметил Даниэль Хёхст в другой публикации , SF теперь напрямую предоставляет информацию о песочнице и производстве:

Летом 14 года (версия 31.0) на поле доступно новое поле. Организационный объект.

выберите Id, IsSandbox из предела организации 1

Из примечаний к выпуску в разделе Новые и измененные объекты:

The Organization object has the following new read-only fields.

InstanceName
IsSandbox
12 голосов
/ 11 октября 2009

Судя по полученным ответам, у Salesforce нет системного объекта, который мог бы сказать мне, работает ли мой код Apex в рабочей среде или в среде песочницы.

Я собираюсь действовать исходя из следующих предположений:

  • Я могу прочитать идентификатор организации текущей среды
  • Идентификатор организации моей производственной системы всегда будет оставаться постоянным.
  • Идентификатор организации песочницы всегда будет отличаться от производственного (поскольку они уникальны)

Текущий идентификатор организации можно найти с помощью System.getOrganizationId()

Мое решение состоит в том, чтобы мой код сравнивал текущий идентификатор организации с постоянным значением, представляющим производство.

3 голосов
/ 23 июня 2011

Я знаю, что это старый пост, но ради людей, которые ищут обновленный ответ, начиная с выпуска Spring '11, есть новый метод System.URL.getSalesforceBaseUrl (). * возвращает текущий URL.
Вы можете работать оттуда, чтобы получить всю необходимую информацию.

Вот ссылка на документацию: http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_url.htm

3 голосов
/ 14 апреля 2010

Я выполняю некромантию здесь, и ответ уже принят, но, возможно, кому-то это будет полезно ...

Используйте одно из этих полей слияния на странице Visualforce / S-Control:

{!$Api.Enterprise_Server_URL_180}, {!$Api.Partner_Server_URL_180}, {!$Api.Session_ID}

Вы можете легко выделить из них идентификатор организации.

В коде Apex: UserInfo.getOrganisationId ()

2 голосов
/ 20 октября 2012

Песочницы могут иметь персонализированный 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));
}   
2 голосов
/ 02 октября 2009

Вызов API входа возвращает элемент песочницы в возвращенной структуре 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>
0 голосов
/ 07 августа 2014

Вы можете использовать следующий блок кода от Майкла Фаррингтона, уполномоченного по Salesforce.

Оригинальное сообщение в блоге здесь: Майкл Фаррингтон: Где я метод

Этот метод вернет true, если вы находитесь в тестовой среде или в изолированной среде, и false в противном случае.

    public Static Boolean isSandbox(){

    String host = URL.getSalesforceBaseUrl().getHost();
    String server = host.substring(0,host.indexOf('.'));

    // It's 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's 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's a hit
            return true;
        }
    }

    // If we made it here it's a production box
    return false;
}
0 голосов
/ 06 марта 2013

Существует аналогичный вопрос в Salesforce StackExchange для определения, находитесь ли вы в изолированной программной среде или нет - Можем ли мы определить, является ли экземпляр Salesforce производственной или изолированной организацией?

В решениях для поиска категории проблемы вы можете использовать идентификатор модуля из OrgId, чтобы определить, имеете ли вы дело с песочницей.

string podId = UserInfo.getOrganizationId().substring(3,4);
boolean isSandbox = 'TSRQPONMLKJZVWcefg'.contains(podId);
System.debug('IsSandbox: ' + isSandbox);

Caveat Confector: Большой недостаток в том, что вам нужно будет обновить список известных модулей песочницы, как и когда Salesforce выводит новые онлайн (так что может быть безопаснее придерживаться других решений).

0 голосов
/ 22 февраля 2012

В своем апекс-коде вы можете использовать следующее, чтобы получить экземпляр 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);
0 голосов
/ 08 октября 2009

Я думаю, что самый простой способ сделать это - создать собственный объект в 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" в настройки удаленного сайта, чтобы заставить это работать (Настройка> Настройка администрирования> Элементы управления безопасностью> Настройки удаленного сайта). Этот код должен запускаться в окне отладки при нажатии» Системный журнал ".

...