检索salesforce实例URL而不是visualforce实例

jmr*_*ian 14 salesforce controllers visualforce apex-code

在visualforce页面中,我需要检索组织的salesforce实例的URL,而不是视觉强制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');
}
Run Code Online (Sandbox Code Playgroud)

public String getSfInstance()
{
  return URL.getSalesforceBaseUrl().toExternalForm();
}
Run Code Online (Sandbox Code Playgroud)

返回c.cs1.visual.force.comhttps://c.cs1.visual.force.com分别.

问题:如何检索我想要的内容:https://cs1.salesforce.com

小智 11

这是我在Apex Trigger中使用的内容

System.URL.getSalesforceBaseUrl().getHost().remove('-api' );
Run Code Online (Sandbox Code Playgroud)

这给了我正确的URL

  • 从Winter'19开始,有一个新函数可以使用,而无需依赖于易碎的字符串操作-`System.URL.getOrgDomainUrl()。toExternalForm()` (2认同)

mmi*_*mix 4

这是一个已知问题,URL.getSalesforceBaseUrl()应该提供此信息,但它没有。然而实际上,这对功能的影响非常有限。

它们的实例域和顶级域是可以互换的,因为请求不属于一个域的 URL 会被重定向到另一个域。

例如,如果您从 cs1.salesforce.com 寻找 /apex/myPage,您将被重定向到 c.cs1...反之亦然,从 apex 域请求 /ID 将使您重定向到实例域(除非详细操作已被覆盖) )

如果这对您没有帮助,则有一种解决方法,尽管非常难看:) 创建一个自定义对象来存储基本 url 并在插入/更新触发器之前创建,该触发器会将 baseURL 字段设置为URL.getSalesforceBaseUrl().toExternalForm()。显然,触发器是平台上唯一可以发挥作用的地方(除了执行匿名,这没有多大用处)。设置应用程序时,将某些内容插入到该表中,然后使用 SOQL 检索基本 url。