2012-02-20 13 views
10

Desde una página de Visualforce, necesito recuperar la URL de la instancia de Salesforce de nuestra organización, y no la URL de la fuerza visual.Recuperar la URL de la instancia de Salesforce en lugar de la instancia de Visualforce

Por ejemplo necesito https://cs1.salesforce.com en lugar de https://c.cs1.visual.force.com

Esto es lo que he probado hasta ahora y el resultado que tengo:

accede a la variable global del sitio de la VF Página:

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

Sidenote: Todo en $Site.xxx parece devolver null.

Desde el controlador Apex:

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

y

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

rendimientos c.cs1.visual.force.com y https://c.cs1.visual.force.com, respectivamente.

Pregunta: ¿Cómo recupero lo que quiero: https://cs1.salesforce.com?

+2

$ El sitio es solo para sitios de fuerza de ventas (http://developer.force.com/sites) – mmix

Respuesta

4

Este es un problema conocido, el URL.getSalesforceBaseUrl() debe proporcionar esta información, pero no es así. Sin embargo, en realidad esto tiene un impacto funcional muy limitado.

Sus dominios de instancia y apex son intercambiables en el sentido de que la solicitud de una URL que no pertenece a uno se redirecciona a la otra.

por ejemplo, si buscas/apex/myPage de cs1.salesforce.com serás redireccionado a c.cs1 ... y viceversa/El ID del dominio apex te redireccionará al dominio de la instancia (a menos que se ha anulado la acción)

Si esto no lo ayuda, hay una solución alternativa, aunque muy fea :) cree un objeto personalizado para almacenar la url base y crear antes de insertar/actualizar el disparador que establecerá el campo baseURL en URL.getSalesforceBaseUrl().toExternalForm(). Aparentemente, el desencadenador es el único lugar en la plataforma donde funcionará (además de ejecutar anónimos, lo cual no es de mucha utilidad). Al configurar la aplicación, inserte algo en esa tabla y luego use SOQL para recuperar la URL base.

+0

La redirección entre c.cs1 ... y cs1.salesforce.com funciona muy bien, excepto que cualquier información de anclaje (c.cs1 .../apex/test # myAnchorInformation) parece eliminarse en ciertos navegadores como Safari en ipad. Esto significa que en situaciones con valores de anclaje, no es posible confiar en la redirección de la plataforma. – sorenkrabbe

4

Aquí hay una propiedad de Apex que puede incluir en una clase de utilidades que devolverá de manera confiable la instancia de su organización. El uso de este, se puede construir fácilmente Salesforce URL de su organización añadiendo ".salesforce.com" a la instancia:

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: Para el Escenario (1), la primera de las 4 partes nombre de host se puede volver muy complicada , pero siempre podrá encontrar el nombre de Instancia como segunda parte.Para aquellos que estén interesados, la sintaxis del Escenario 1 sigue este patrón:

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

Aquí tienes un muy bonito y pequeño fragmento, que hace, lo que debería para VisualforcePages :-)

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

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

+0

La instancia podría ser cs87 o eu3, en este caso, los números codificados no funcionarán. También como lo menciona zachelrath, podríamos tener un nombre de dominio. Entonces, esto fallaría en tales escenarios. –

9

Aquí hay algo que he utilizado dentro de mi Apex gatillo

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

Esto me da URL adecuada

0

Fix a Alex_E fragmento:

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

Se trata de una plataforma de deficiencia lamentable. GetSalesforceBaseUrl() viene con advertencias que incluyen:

  • el protocolo devuelto (http vs https) es inconsistent,
  • contexto Visualforce afecta al resultado (como se vio con el subdominio)
  • uso de mi dominio y areneros también afecta el resultado, por lo que la manipulación de cadenas arriesgada,

la única manera confiable de obtener el verdadero punto final vaina/ejemplo es el uso de la Salesforce Identity API.

Aquí hay una memoized estática puede utilizar, que mitiga todos los factores anteriores:

/** 
* 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

Esto funciona, excepto en el caso en que se llama al código desde un desencadenador. Desafortunadamente. –

0

Esto funciona para mí:

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

Aquí hay algo que ver con la expresión regular

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