web-dev-qa-db-de.com

Rufen Sie die URL der Salesforce-Instanz anstelle der Visualforce-Instanz ab

Auf einer Visualforce-Seite muss die URL der Salesforce-Instanz unserer Organisation und nicht die Visualforce-URL abgerufen werden.

Zum Beispiel brauche ich https://cs1.salesforce.com anstelle von https://c.cs1.visual.force.com

Folgendes habe ich bisher ausprobiert:

Zugriff auf die globale Variable Site von der VF-Seite:

<apex:outputText value="{!$Site.Domain}" /> gibt null zurück

Nebenbemerkung: Alles in $Site.xxx scheint null zurückzugeben.

Vom Apex-Controller:

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

und

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

gibt c.cs1.visual.force.com bzw. https://c.cs1.visual.force.com zurück.

Frage: Wie kann ich abrufen, was ich möchte: https://cs1.salesforce.com?

11
jmrjulian

Folgendes habe ich in meinem Apex-Trigger verwendet

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

Dies gibt mir die richtige URL

10
Shivanath D

Hier ist eine Apex-Eigenschaft, die Sie in eine Utility-Klasse einfügen können, die die Instanz für Ihre Organisation zuverlässig zurückgibt. Auf diese Weise können Sie die Salesforce-URL Ihrer Organisation einfach erstellen, indem Sie ".salesforce.com" an die Instanz anhängen:

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

}

Zu Ihrer Information: In Szenario (1) kann der erste des vierteiligen Hostnamens sehr kompliziert werden, aber Sie finden den Instanznamen immer als zweiten Teil. Für diejenigen, die interessiert sind, folgt die Syntax von Szenario 1 diesem Muster:

     <MyDomain>--<SandboxName>--<Namespace>.<Instance>.visual.force.com
4
zachelrath

Dies ist ein bekanntes Problem. Die Funktion URL.getSalesforceBaseUrl() sollte diese Informationen bereitstellen, tut dies jedoch nicht. In Wirklichkeit hat dies jedoch nur sehr begrenzte funktionale Auswirkungen.

Ihre Instanz- und Apex-Domänen sind in dem Sinne austauschbar, dass das Anfordern einer URL, die nicht zu einer gehört, auf die andere umgeleitet wird.

wenn Sie beispielsweise/apex/myPage von cs1.salesforce.com aus suchen, werden Sie zu c.cs1 weitergeleitet. Wenn Sie umgekehrt/ID von der Apex-Domäne anfordern, werden Sie zur Instanzdomäne weitergeleitet (es sei denn, die Detailaktion wurde überschrieben )

Wenn dies nicht hilft, gibt es eine, wenn auch sehr hässliche Problemumgehung :) Erstellen Sie ein benutzerdefiniertes Objekt zum Speichern der Basis-URL und erstellen Sie vor dem Einfügen/Aktualisieren einen Auslöser, der das baseURL-Feld auf URL.getSalesforceBaseUrl().toExternalForm() setzt. Anscheinend ist Trigger der einzige Ort auf der Plattform, an dem dies funktioniert (abgesehen von anonymer Ausführung, die nicht viel bringt). Fügen Sie beim Einrichten der App etwas in diese Tabelle ein und rufen Sie später mithilfe von SOQL die Basis-URL ab.

4
mmix

Hier haben Sie ein recht schönes und kleines Snippet, das tut, was es für VisualforcePages sollte :-)

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

// Rückgabe: https://cs7.salesforce.com/00kM00000050jFMIAY

3
Alex_E

Dies ist ein unglücklicher Plattformmangel. GetSalesforceBaseUrl() beinhaltet folgende Vorbehalte:

  • das zurückgegebene Protokoll (http vs https) ist inkonsistent ,
  • der Visualforce-Kontext beeinflusst das Ergebnis (wie Sie mit der Subdomain gesehen haben)
  • die Verwendung von Meine Domäne und Sandboxen wirkt sich auch auf das Ergebnis aus, was die Manipulation von Strings riskant macht.

Der einzig zuverlässige Weg, um den Endpunkt des echten Pods/der Instanz zu erhalten, ist die Verwendung der Salesforce Identity-API .

Hier ist ein memoized static, den Sie verwenden können, um alle oben genannten Faktoren abzuschwächen:

/**
 * 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;
    }
}
2
bigassforce

Hier ist etwas mit Regex zu tun

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

Fix zum Alex_E-Snippet:

    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;
0
flor

Das funktioniert für mich:

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