2009-10-02 15 views
15

Sto integrando i nostri sistemi di back-end con Salesforce utilizzando i servizi web. Ho ambienti di produzione e stage in esecuzione su URL diversi. Devo essere in grado di fare in modo che l'endpoint della chiamata al servizio web sia diverso a seconda che il codice sia in esecuzione nell'istanza Salesforce di sandbox o di produzione.Come posso rilevare l'ambiente in Salesforce?

Come rilevare l'ambiente.

Attualmente sto considerando di cercare un utente per vedere se il nome utente finisce in "devsandbox" perché non sono stato in grado di identificare un oggetto di sistema che posso interrogare per ottenere l'ambiente.

Ulteriori chiarimenti:

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 deve sapere se è in esecuzione nell'ambiente Salesforce di produzione o sandbox.

+0

Se si conosce entrambi gli URL, perché non basta controllare l'URL corrente per vedere dove sei? –

+0

In che modo il mio codice Apex nel mio controller personalizzato arriva all'URL della pagina che lo ha richiamato? –

risposta

11

Per trovare questo tramite i risultati di ricerca, c'è un aggiornamento importante. Come Daniel Hoechst ha sottolineato in another post, SF ora offre direttamente sandbox contro le informazioni di produzione:

In estate '14, (versione 31.0), c'è un nuovo campo disponibile per l'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 
2

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

Funzionerebbe sul back-end ma il mio problema è nel mio controller personalizzato che deve determinare quale servizio Web di back-end richiamare –

0

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 quell'oggetto. Un suggerimento sarebbe utilizzare i costruttori statici Apex per caricare queste informazioni e memorizzarle nella cache per la richiesta.

Un altro pensiero che ho avuto (ma detesto suggerire) è di utilizzare un servizio esterno per determinare dove è in esecuzione il codice Apex. Questo potrebbe essere difficile da eseguire, poiché ogni volta che la server farm Salesforce cambia, il codice si spezzerebbe, ma ho pensato di buttarlo lì.

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 ottenere questo al lavoro (Configurazione> Impostazione amministrazione> Controlli di sicurezza> Impostazioni sito remoto). Questo codice dovrebbe essere eseguito nella finestra di debug quando si fa clic su "Registro di sistema".

+0

Avevo già considerato il primo ma ero preoccupato che questo dovesse essere modificato manualmente ogni volta che una sandbox è rinfrescato. Il costo di mancare questo aggiornamento manuale è che i dati di stage/test andranno in produzione sul back-end. La seconda opzione è intrigante, ma come si afferma non è stabile. –

12

In base alle risposte sembra che Salesforce non disponga di un oggetto di sistema che può dirmi se il mio codice Apex è in esecuzione in produzione o in 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)

La corrente di ID organizzazione può essere trovata con System.getOrganizationId()

La mia soluzione è quella di avere il mio codice confrontare la corrente org id al valore costante che rappresenta la produzione.

+2

Questi risultati si sono rivelati validi per quanto ne sai? –

+0

Si noti che Salesforce memorizza l'ID organizzazione in modo diverso a seconda del contesto: http://stackoverflow.com/questions/3213470/salesforce-com-id-attribute-seems-to-have-a-15-and-18-character- value-whats-the – chris

+0

UserInfo.getOrganizationId() – ttt

3

Qui eseguo la negromanzia e la risposta è già accettata, ma forse qualcuno ne trarrà vantaggio ...

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

3

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 System.URL.getSalesforceBaseUrl() .toExternalForm() che restituisce l'URL corrente.
Puoi lavorare da lì per ottenere tutte le informazioni che ti servono.

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

+0

Per riferimento: public Boolean isSandbox() { return URL.getSalesforceBaseUrl(). getHost(). left (2) .equalsignorecase ('cs'); } – ceiroa

0

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

Tenendolo dinamica farà in modo che non si dispone di per aggiornare il codice quando la tua organizzazione viene migrata in un'altra istanza.

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

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

C'è una domanda simile sul Salesforce StackExchange per rilevare se ci si trova in una sandbox o no - Can we determine if the Salesforce instance is production org or a Sandbox org?

nel solutions in search of a problem category, è possibile utilizzare l'identificatore del pod dall'OrgId per determinare se hai a che fare con 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).

0

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

post originale qui: Michael Farrington: Where Am I Method

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; 
} 
Problemi correlati