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.xxx
はnull
を返すようです。
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
?
これが私のApex Trigger内で使用したものです
System.URL.getSalesforceBaseUrl().getHost().remove('-api' );
これは私に適切なURLを与えます
以下は、組織のインスタンスを確実に返す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
これは既知の問題です。URL.getSalesforceBaseUrl()
はこの情報を提供するはずですが、提供しません。ただし、実際には、これによる機能への影響は非常に限られています。
それらのインスタンスとapexドメインは、一方に属していないURLを要求すると、もう一方にリダイレクトされるという意味で交換可能です。
たとえば、cs1.salesforce.comから/ apex/myPageをシークすると、cs.cs1にリダイレクトされます。逆に、apexドメインから/ IDを要求すると、インスタンスドメインにリダイレクトされます(詳細なアクションがオーバーライドされていない場合) )
これで問題が解決しない場合は、非常に醜いものの、回避策が1つあります。ベースURLを格納するカスタムオブジェクトを作成し、baseURLフィールドをURL.getSalesforceBaseUrl().toExternalForm()
に設定する前に挿入/更新トリガーを作成します。どうやらトリガーは、これが機能するプラットフォーム上の唯一の場所です(あまり役に立たない匿名の実行を除いて)。アプリを設定するときに、そのテーブルに何かを挿入し、後でSOQLを使用してベースURLを取得します。
ここに、VisualforcePagesに何をすべきかを示す、非常に優れた小さなスニペットがあります:-)
String sUrlRewrite = System.URL.getSalesforceBaseUrl().getHost();
// Example: c.cs7.visual.force.com
sUrlRewrite = 'https://'
+ sUrlRewrite.substring(2,6)
+ 'salesforce.com'
+ '/'
+ recordId;
これは残念なプラットフォームの欠点です。 GetSalesforceBaseUrl()
には、次の警告が含まれています。
真のポッド/インスタンスエンドポイントを取得する唯一の信頼できる方法は、 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;
}
}
これは正規表現と関係があります
public String getURL() {
return String.format(
'https://{0}.salesforce.com',
new String[]{
URL.getSalesforceBaseUrl().getHost().substringAfter('.').substringBefore('.')
});
}
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;
これは私にとってはうまくいきます:
String sUrlRewrite = System.URL.getSalesforceBaseUrl().getProtocol()
+ '://' + System.URL.getSalesforceBaseUrl().getHost()
+ '/' + record.Id;