Pergunta

Estou integrando nossos sistemas de back -end ao Salesforce usando os Serviços da Web. Tenho ambientes de produção e palco em diferentes URLs. Eu preciso poder ter o ponto de extremidade da chamada de serviço da web, dependendo se o código está em execução na instância de produção ou sandbox salesforce.

Como faço para detectar o ambiente.

Atualmente, estou pensando em procurar um usuário para ver se o nome de usuário termina em 'devSandbox', pois não consegui identificar um objeto do sistema que posso consultar para obter o ambiente.

Maior esclarecimento:

O local que preciso determinar isso está dentro do código do Apex que é chamado quando seleciono um botão no Salesforce. Meu controlador personalizado precisa saber se está em execução no ambiente de produção ou sandbox Salesforce.

Foi útil?

Solução

Para que você encontre isso por meio de resultados de pesquisa, há uma atualização importante. Como Daniel Hoechst apontou em Outro post, SF agora fornece diretamente as informações de sandbox vs. produção:

No verão '14, (versão 31.0), há um novo campo disponível no objeto da organização.

Das notas de lançamento em Objetos novos e de mudança:

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

InstanceName
IsSandbox

Outras dicas

Com base nas respostas, parece que o Salesforce não possui um objeto do sistema que pode me dizer se meu código Apex está em execução na produção ou em um ambiente de sandbox.

Vou prosseguir com base nas seguintes suposições:

  • Eu posso ler o ID da organização do ambiente atual
  • O ID da organização do meu sistema de produção sempre permanecerá constante.
  • O ID da organização de uma caixa de areia sempre será diferente da produção (como eles são únicos)

O ID da organização atual pode ser encontrado com System.getOrganizationId()

Minha solução é fazer com que meu código compare o ID da organização atual com o valor constante que representa a produção.

Estou realizando necromancia aqui e a resposta já é aceita, mas talvez alguém se beneficie disso ...

Use um desses campos de mesclagem em sua página do Visualforce / S-Control:

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

Você pode analisar facilmente o ID da organização.

No código do Apex: UserInfo.getorganisationId ()

Eu sei que este é um post antigo, mas apenas para as pessoas que procuram uma resposta atualizada a partir do lançamento da primavera '11 Há um novo método System.url.getsalesforceBaseurl (). ToExternalform () que retorna o URL atual.
Você pode trabalhar a partir daí para obter todas as informações necessárias.

Aqui está o link para os documentos: http://www.salesforce.com/us/developer/docs/apexcode/content/apex_methods_system_url.htm

A chamada da API de login retorna um elemento de caixa de areia na estrutura de loginResult retornada que indica se é um ambiente de caixa de areia ou não, a partir do 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>

As caixas de areia podem ter um URL personalizado (por exemplo, acme.cs1.my.salesforce.com), ou pode estar hospedando uma página do visualforce (cs2.visual.force.com) ou ambos (acme.cs2.visual.force.com) então eu Use este método:

public static Boolean isRunningInSandbox() {
    String s  =  System.URL.getSalesforceBaseUrl().getHost();
    return (Pattern.matches('(.*\\.)?cs[0-9]*(-api)?\\..*force.com',s));
}   

Eu acho que a maneira mais fácil de fazer isso seria criar um objeto personalizado no Salesforce e, em seguida, armazenar um valor indicando sandbox ou produção lá. Seu código Apex pode então consultar esse objeto. Uma sugestão seria usar os construtores estáticos da Apex para carregar essas informações e armazená -las para a solicitação.

Outro pensamento que eu tinha (mas odeio sugerir) é usar um serviço externo para determinar onde seu código Apex está executando. Provavelmente, isso seria difícil de realizar, pois toda vez que a fazenda do Salesforce Server muda, há uma alteração que seu código quebraria, mas eu apenas pensei em jogar isso lá fora.

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());

Você tem que adicionar "http://www.whatismyip.com"Para as configurações remotas do site para fazer com que isso funcione (Configuração> Configuração da administração> Controles de segurança> Configurações do site remoto). Esse código deve ser executado na janela de depuração ao clicar em" Log do sistema ".

No seu código Apex, você pode usar o seguinte para obter a instância do SF em que você está.

Mantê -lo dinâmico garantirá que você não precise atualizar seu código quando sua organização for migrada para uma instância diferente.

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);

Há uma pergunta semelhante no Salesforce Stackexchange para detectar se você estiver em uma caixa de areia ou não - Podemos determinar se a instância do Salesforce é organização de produção ou uma caixa de areia?

No soluções em busca de uma categoria de problema, você pode usar o identificador de pod do orgid para determinar se está lidando com uma caixa de areia.

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

Confetor de advertência: A grande fraqueza aqui é que você precisará atualizar a lista de vagens de sandbox Know como e quando o Salesforce traz novos on -line (para que seja mais seguro manter as outras soluções).

Você pode usar o seguinte bloco de código de Michael Farrington uma autoridade no Salesforce.

Postagem original do blog aqui: Michael Farrington: onde estou o método

Este método retornará verdadeiro se você estiver em um ambiente de teste ou sandbox e false, caso contrário.

    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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top