Domanda

sto integrando i nostri sistemi di back-end con Salesforce utilizzando i servizi web. Ho ambienti di produzione e di scena in esecuzione su URL diversi. Ho bisogno di essere in grado di avere il punto finale della chiamata di servizio Web essere diverso a seconda che il codice viene eseguito nella produzione o nella sandbox esempio Salesforce.

Come faccio a rilevare l'ambiente.

Al momento sto considerando Ricerca di un utente per vedere se c'è il nome utente finisce in 'devsandbox' come sono stato in grado di identificare un oggetto di sistema che posso interrogare per ottenere l'ambiente.

Un ulteriore chiarimento:

La posizione che ho bisogno per determinare questo è all'interno del codice Apex che viene richiamato quando si seleziona un pulsante in Salesforce. Il mio controller personalizzato ha bisogno di sapere se in esecuzione nella produzione o nella sandbox ambiente Salesforce.

È stato utile?

Soluzione

Per tutti voi trovare questo tramite risultati di ricerca, v'è un aggiornamento importante. Come Daniel Hoechst ha sottolineato nel un altro post , SF ora offre direttamente sandbox contro le informazioni di produzione:

  

In estate '14, (versione 31.0), c'è un nuovo campo disponibile sul   oggetto Organizzazione.

     

Selezionare ID, IsSandbox dal limite Organizzazione 1

     

Dalle note di rilascio sotto una nuova e modificare gli oggetti:

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

InstanceName
IsSandbox

Altri suggerimenti

In base alle risposte sembra che Salesforce non dispone di un oggetto di sistema che mi può dire se il mio codice Apex è in esecuzione in produzione o un ambiente sandbox.

Ho intenzione di procedere sulla base delle seguenti ipotesi:

  • posso leggere l'id organizzazione del contesto attuale
  • L'id organizzazione del mio sistema di produzione rimarrà sempre costante.
  • L'id organizzazione di una sandbox sarà sempre diversa alla produzione (come sono unici)

L'ID attuale organizzazione può essere trovata con System.getOrganizationId()

La mia soluzione è quella di avere il mio codice confrontare la corrente id org alla produzione di rappresentare valore costante.

sto eseguendo necromanzia qui e la risposta è già accettato, ma forse qualcuno ne trarre beneficio da esso ...

Utilizzare uno di questi campi unione sulla tua pagina Visualforce / S-Control:

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

Si può facilmente analizzare fuori organizzazione ID fuori di essi.

Nel codice Apex: UserInfo.getOrganisationId ()

So che questo è un vecchio post, ma solo per il gusto di persone in cerca di una risposta aggiornata a partire dalla primavera '11 rilascio C'è un nuovo metodo di System.URL.getSalesforceBaseUrl (). ToExternalForm () che restituisce l'URL corrente.
È possibile lavorare da lì per ottenere tutte le informazioni necessarie.

Ecco il link alla documentazione: http: // www. salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_url.htm

La chiamata di accesso API restituisce un elemento sandbox nella struttura LoginResult restituita che indica se un ambiente sandbox o no, dal 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>

sandbox può avere un url personalizzato (ad es acme.cs1.my.salesforce.com), o potrebbe essere che ospita una pagina Visualforce (cs2.visual.force.com) o entrambi (acme.cs2.visual.force.com ) in modo da utilizzare questo metodo:

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

Penso che il modo più semplice per farlo sarebbe quello di creare un oggetto personalizzato in Salesforce, e quindi memorizzare un valore che indica sandbox o di produzione lì. Il tuo codice Apex può quindi interrogare l'oggetto. Un suggerimento potrebbe essere quello di utilizzare costruttori statici Apex per caricare queste informazioni e memorizzare nella cache per la richiesta.

Un altro pensiero che ho avuto (ma odio per suggerire) è quello di utilizzare un servizio esterno per determinare dove il codice Apex è in esecuzione. Questo sarebbe probabilmente difficile da tirare fuori, come ogni volta che il server farm SalesForce cambia c'è un cambiamento il codice si romperebbe, ma ho solo pensato che avrei buttare questo là fuori.

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

Si deve aggiungere " http://www.whatismyip.com " per le impostazioni di sito remoto per arrivare a questo lavoro (Configurazione> Impostazione amministrazione> Controlli di sicurezza> Impostazioni sito remoto). Questo codice dovrebbe essere eseguito nella finestra di debug quando si fa clic su "System Log".

Nel codice apice è possibile utilizzare il seguente per ottenere l'istanza di SF che si è in.

Tenendolo dinamica farà in modo che non c'è bisogno di aggiornare il codice quando l'org è migrato a un'istanza diversa.

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

C'è una domanda simile sul Salesforce StackExchange per rilevare se ci si trova in una sandbox o no - Possiamo determinare se l'istanza di Salesforce è la produzione org o un sandbox org?

Nelle soluzioni in cerca di una categoria problema , è possibile utilizzare l'identificatore pod dal OrgID per determinare se si tratta di una sandbox.

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

Caveat Confector: La grande debolezza è che è necessario aggiornare l'elenco dei baccelli conoscenze sandbox come e quando Salesforce porta nuove quelli online (quindi potrebbe essere attaccare più al sicuro con le altre soluzioni) .

È possibile utilizzare il seguente blocco di codice da Michael Farrington un'autorità in Salesforce.

post originale qui: Michael Farrington: Where Am I Metodo

Questo metodo restituisce true se si è in un ambiente di test o sandbox e false altrimenti.

    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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top