Как определить среду в 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;
}