web-dev-qa-db-ja.com

Visualforceインスタンスの代わりにsalesforceインスタンスのURLを取得する

Visualforceページから、組織のsalesforceインスタンスのURLではなく、visual force URLを取得する必要があります。

たとえば、https://cs1.salesforce.com の代わりに https://c.cs1.visual.force.com

これが私がこれまでに試したことと私が得た結果です:

VFページからSiteグローバル変数にアクセスしました:

<apex:outputText value="{!$Site.Domain}" />nullを返します

補足:$Site.xxxnullを返すようです。

Apexコントローラから:

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

そして

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

戻り値 c.cs1.visual.force.comおよびhttps://c.cs1.visual.force.com、それぞれ。

質問:必要なものを取得するにはどうすればよいですか:https://cs1.salesforce.com

14
jmrjulian

これが私のApex Trigger内で使用したものです

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

これは私に適切なURLを与えます

11
Shivanath D

以下は、組織のインスタンスを確実に返すUtilityクラスにスローできるApexプロパティです。これを使用すると、インスタンスに「.salesforce.com」を追加することで、組織のSalesforce URLを簡単に構築できます。

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

}

参考:シナリオ(1)の場合、4つの部分からなるホスト名の1番目は非常に複雑になる可能性がありますが、2番目の部分としてインスタンス名を常に見つけることができます。興味がある人のために、シナリオ1の構文は次のパターンに従います。

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

これは既知の問題です。URL.getSalesforceBaseUrl()はこの情報を提供するはずですが、提供しません。ただし、実際には、これによる機能への影響は非常に限られています。

それらのインスタンスとapexドメインは、一方に属していないURLを要求すると、もう一方にリダイレクトされるという意味で交換可能です。

たとえば、cs1.salesforce.comから/ apex/myPageをシークすると、cs.cs1にリダイレクトされます。逆に、apexドメインから/ IDを要求すると、インスタンスドメインにリダイレクトされます(詳細なアクションがオーバーライドされていない場合) )

これで問題が解決しない場合は、非常に醜いものの、回避策が1つあります。ベースURLを格納するカスタムオブジェクトを作成し、baseURLフィールドをURL.getSalesforceBaseUrl().toExternalForm()に設定する前に挿入/更新トリガーを作成します。どうやらトリガーは、これが機能するプラットフォーム上の唯一の場所です(あまり役に立たない匿名の実行を除いて)。アプリを設定するときに、そのテーブルに何かを挿入し、後でSOQLを使用してベースURLを取得します。

4
mmix

ここに、VisualforcePagesに何をすべきかを示す、非常に優れた小さなスニペットがあります:-)

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

//戻り値: https://cs7.salesforce.com/00kM00000050jFMIAY

3
Alex_E

これは残念なプラットフォームの欠点です。 GetSalesforceBaseUrl()には、次の警告が含まれています。

  • 返されるプロトコル(http vs https)は inconsistent
  • visualforceコンテキストが結果に影響する(サブドメインで見たように)
  • 私のドメインとサンドボックスの使用も結果に影響し、文字列操作が危険になります。

真のポッド/インスタンスエンドポイントを取得する唯一の信頼できる方法は、 Salesforce Identity APIを使用することです

以下は、使用可能な memoized staticであり、上記のすべての要因を軽減します。

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

これは正規表現と関係があります

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

Alex_Eスニペットの修正:

    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

これは私にとってはうまくいきます:

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