Вопрос

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

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

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

Дальнейшее уточнение:

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

Это было полезно?

Решение

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

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

Выберите ID, Issandbox из лимита организации 1

Из заметок о выпуске под новыми и изменением объектов:

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

InstanceName
IsSandbox

Другие советы

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

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

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

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

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

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

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

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

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

В коде вершины: Userinfo.getorganisationId ()

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

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

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

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

Я думаю, что самым простым способом сделать это было бы создать пользовательский объект в Salesforce, а затем хранить его значение, указывающее на песочницу или производство. Ваш код вершины может затем запросить этот объект. Одним из предложений будет использование статических конструкторов Apex для загрузки этой информации и кэширования ее для запроса.

Еще одна мысль, которую я имел (но ненавижу), - это использовать внешнюю службу, чтобы определить, где выполняется ваш код вершины. Это, вероятно, было бы трудно осуществить, так как каждый раз, когда изменяется ферма Salesforce Server, возникает изменение, который сломается, но я просто думал, что выброшу это.

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

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

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

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

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

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

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

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

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

    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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top