2012-02-20 6 views
10

Da una pagina di Visualforce, ho bisogno di recuperare l'URL dell'istanza di Salesforce della nostra organizzazione e non l'URL della forza visiva.Recupera l'URL dell'istanza di Salesforce anziché l'istanza di Visualforce

Per esempio ho bisogno https://cs1.salesforce.com invece di https://c.cs1.visual.force.com

Ecco quello che ho provato finora e il risultato che ho ottenuto:

accede alla variabile globale del sito dalla VF Pagina:

<apex:outputText value="{!$Site.Domain}" /> restituisce null

Sidenote: Tutto in $Site.xxx sembra restituire null.

Dal controller Apex:

public String getSfInstance() 
{ 
    return ApexPages.currentPage().getHeaders().get('Host'); 
} 

e

public String getSfInstance() 
{ 
    return URL.getSalesforceBaseUrl().toExternalForm(); 
} 

rendimenti rispettivamente c.cs1.visual.force.com e https://c.cs1.visual.force.com,.

Domanda: come recuperare ciò che desidero: https://cs1.salesforce.com?

+2

$ Il sito è solo per i siti salesforce (http://developer.force.com/sites) – mmix

risposta

4

Questo è un problema noto, lo URL.getSalesforceBaseUrl() dovrebbe fornire questa informazione ma non è così. Tuttavia in realtà ciò ha un impatto funzionale molto limitato.

I loro domini di istanza e apice sono intercambiabili nel senso che richiedere un URL che non appartiene a uno viene reindirizzato all'altro.

per esempio se cerchi/apex/myPage da cs1.salesforce.com verrai reindirizzato a c.cs1 ... e vice versa richiesta/ID da dominio apex ti porterà reindirizzato al dominio di istanza (a meno che l'azione è stata sostituita)

Se questo non ti aiuta c'è una soluzione, anche se molto brutto :) creare un oggetto personalizzato per memorizzare l'URL di base e di creare prima di inserimento/aggiornamento di innesco che consentirà di definire il campo baseURL a URL.getSalesforceBaseUrl().toExternalForm(). Apparentemente il trigger è l'unico posto sulla piattaforma in cui funzionerà (a parte l'esecuzione anonimo che non è molto utile). Quando si imposta l'app, inserire qualcosa in quella tabella e utilizzare in seguito SOQL per recuperare l'URL di base.

+0

Il reindirizzamento tra c.cs1 ... e cs1.salesforce.com funziona alla grande, eccetto che qualsiasi informazione di ancoraggio (c.cs1 .../apex/test # myAnchorInformation) sembra essere rimossa in alcuni browser come Safari su ipad. Ciò significa che in situazioni con valori di ancoraggio, non è possibile fare affidamento sul reindirizzamento della piattaforma. – sorenkrabbe

4

Ecco una proprietà Apex che è possibile inserire in una classe di utilità che restituirà in modo affidabile l'istanza per l'organizzazione. Con questo, si può facilmente costruire URL Salesforce dell'organizzazione aggiungendo ".salesforce.com" per l'istanza:

public class Utils { 

// Returns the Salesforce Instance that is currently being run on, 
// e.g. na12, cs5, etc. 
public static String Instance { 
    public get { 
     if (Instance == null) { 
      // 
      // Possible Scenarios: 
      // 
      // (1) ion--test1--nexus.cs0.visual.force.com --- 5 parts, Instance is 2nd part 
      // (2) na12.salesforce.com  --- 3 parts, Instance is 1st part 
      // (3) ion.my.salesforce.com --- 4 parts, Instance is not determinable 

      // Split up the hostname using the period as a delimiter 
      List<String> parts = System.URL.getSalesforceBaseUrl().getHost().replace('-api','').split('\\.'); 
      if (parts.size() == 3) Instance = parts[0]; 
      else if (parts.size() == 5) Instance = parts[1]; 
      else Instance = null; 
     } return Instance; 
    } private set; 
} 

// And you can then get the Salesforce base URL like this: 
public static String GetBaseUrlForInstance() { 

    return 'https://' + Instance + '.salesforce.com'; 

} 

FYI: Per Scenario (1), il 1 ° del 4 parti hostname può ottenere molto complicato , ma sarai sempre in grado di trovare il nome dell'istanza come seconda parte.Per coloro che sono interessati, la sintassi di Scenario 1 segue questo schema:

 <MyDomain>--<SandboxName>--<Namespace>.<Instance>.visual.force.com 
3

Ecco una molto carino e piccolo frammento, che fa, quello che dovrebbe per VisualforcePages :-)

 String sUrlRewrite = System.URL.getSalesforceBaseUrl().getHost(); 
     // Example: c.cs7.visual.force.com 
     sUrlRewrite = 'https://' 
       + sUrlRewrite.substring(2,6) 
       + 'salesforce.com' 
       + '/' 
       + recordId; 

// Restituisce: https://cs7.salesforce.com/00kM00000050jFMIAY

+0

L'istanza potrebbe essere cs87 o eu3, in questo caso i numeri hardcoded non funzioneranno. Come menzionato da zachelrath, potremmo avere il nome di dominio. Quindi, questo fallirebbe in tali scenari. –

9

Ecco qualcosa che ho usato nel mio Apex trigger

System.URL.getSalesforceBaseUrl().getHost().remove('-api'); 

Questo mi dà il corretto URL

0

Fix per Alex_E frammento:

String sUrlRewrite = System.URL.getSalesforceBaseUrl().getHost(); 
    String sfBaseProtocol = System.URL.getSalesforceBaseUrl().getProtocol(); 

    //remove namespace 
    integer firstDotPos = sUrlRewrite.indexOf('.'); 
    sURlRewrite = sURlRewrite.substring(firstDotPos+1); 

    //replace visual.force with salesforce 
    sURlRewrite = sURlRewrite.replace('visual.force', 'salesforce'); 
    sUrlRewrite = sfBaseProtocol+'://'+sURlRewrite; 

serverURL = sUrlRewrite; 
1

Si tratta di una lacuna della piattaforma sfortunato. GetSalesforceBaseUrl() viene fornito con avvertimenti, tra cui:

  • il protocollo restituita (http o https) è inconsistent,
  • contesto Visualforce influenza il risultato (come si è visto con il sottodominio)
  • uso del mio dominio e sandbox colpisce anche il risultato, rendendo la manipolazione di stringhe rischioso,

l'unico modo affidabile per ottenere la vera endpoint baccello/istanza è utilizzare il Salesforce Identity API.

Ecco un memoized statica è possibile utilizzare, che mitiga tutti i fattori di cui sopra:

/** 
* Determines the true API hostname for a Salesforce org using the Identity API. 
* eg 'https://pod.salesforce.com' (most orgs) 
* eg 'https://custom.my.salesforce.com' (my domain) 
* eg 'https://custom--dev.pod.my.salesforce.com' (sandbox orgs) 
*/ 
static public String protocolAndHost { 
    get { 
     if (protocolAndHost == null) { 
      //memoize 
      String uid = UserInfo.getUserId(); 
      String sid = UserInfo.getSessionId(); 
      String oid = UserInfo.getOrganizationId(); 
      String base = Url.getSalesforceBaseUrl().toExternalForm(); 

      //use getSalesforceBaseUrl within batches and schedules (not Visualforce), and fix inconsistent protocol 
      if (sid == null) return base.replaceFirst('http:', 'https:'); 

      //within test context use url class, else derive from identity response 
      PageReference api = new PageReference('/id/' + oid + '/' + uid + '?access_token=' + sid); 
      String content = Test.isRunningTest() ? '{"urls":{"profile":"' + base + '"}}' : api.getContent().toString(); 
      Url profile = new Url(content.substringBetween('"profile":"', '"')); 
      protocolAndHost = profile.getProtocol() + '://' + profile.getHost(); 
     } 
     return protocolAndHost; 
    } 
} 
+0

Questo funziona tranne nel caso in cui il codice viene chiamato da un trigger. Purtroppo. –

0

Questo funziona per me:

String sUrlRewrite = System.URL.getSalesforceBaseUrl().getProtocol() 
    + '://' + System.URL.getSalesforceBaseUrl().getHost() 
    + '/' + record.Id; 
0

Ecco qualcosa a che fare con le espressioni regolari

public String getURL() { 
    return String.format(
     'https://{0}.salesforce.com', 
     new String[]{ 
     URL.getSalesforceBaseUrl().getHost().substringAfter('.').substringBefore('.') 
     }); 
} 
Problemi correlati