2012-02-20 62 views
10

從visualforce頁面中,我需要檢索組織的salesforce實例的URL,而不是可視強制URL。檢索salesforce實例URL而不是visualforce實例

比如我需要https://cs1.salesforce.com代替https://c.cs1.visual.force.com

這裏是我到目前爲止已經試過和結果我:

從VF頁訪問其網站的全局變量:

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

旁註:一切都在$Site.xxx似乎要返回null

從頂點控制器:

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

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

返回c.cs1.visual.force.comhttps://c.cs1.visual.force.com,分別。

問題:如何檢索我想要的:https://cs1.salesforce.com

+2

$網站僅適用於salesforce網站(http://developer.force.com/sites) – mmix 2012-02-21 08:40:25

回答

4

這是一個已知問題,URL.getSalesforceBaseUrl()應提供此信息,但它沒有。然而實際上這對功能的影響非常有限。

他們的實例和apex域可以互換,因爲請求一個不屬於某個的URL會被重定向到另一個。

例如,如果您從cs1.salesforce.com尋求/ apex/myPage,您將被重定向到c.cs1 ...,反之亦然,請求來自apex域的/ ID將使您重定向到實例域(除非詳細信息行動已被覆蓋)

如果這沒有幫助你有一個解決方法,雖然非常醜陋:)創建一個自定義對象來存儲基址和插入/更新觸發器之前創建將設置baseURL字段URL.getSalesforceBaseUrl().toExternalForm()。顯然,觸發器是平臺上唯一可以工作的地方(除了匿名執行沒有多大用處)。設置應用程序時,在該表中插入一些內容,然後使用SOQL來檢索基本URL。

+0

c.cs1 ...和cs1.salesforce.com之間的重定向非常有效,除了任何錨信息(c.cs1 .../apex/test#myAnchorInformation)似乎都會在某些瀏覽器(如Safari上的ipad)中被刪除。這意味着在具有定位值的情況下,不可能依賴平臺重定向。 – sorenkrabbe 2013-08-02 08:11:39

4

這是一個Apex屬性,您可以將其放入Utility類中,該類可以可靠地返回組織的實例。利用這一點,你可以很容易地通過附加「.salesforce.com」的實例構建您的組織的Salesforce網址:

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:對於方案(1),4部分主機名的第一個可以得到非常複雜,但您始終可以找到實例名稱作爲第二部分。對於那些有興趣誰,方案1的語法遵循這種模式:

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

這裏有一個相當不錯的小片段,這不,它應該爲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

+0

實例可能是cs87或eu3,在這種情況下,硬編碼數字將不起作用。正如zachelrath所提到的,我們可以擁有域名。所以,在這種情況下這會失敗。 – 2016-06-12 06:14:38

9

這裏的東西我在我的Apex觸發

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

這給了我正確的URL

0

修復到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; 
1

這是一個不幸的平臺的缺點。 GetSalesforceBaseUrl()帶有警告包括:

  • 返回的協議(http和https)爲inconsistent
  • visualforce方面影響的結果
  • 使用我的域名和沙箱也影響(如你與子域所看到的)結果,使得字符串操作風險,

唯一可靠的方式來獲得真正的莢/實例端點使用​​。

這裏有一個memoized靜態你可以使用,這減輕了上述所有因素:

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

這適用於從觸發器調用代碼的情況。不幸。 – 2015-01-14 07:04:21

0

這個工作對我來說:

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

這裏是與正則表達式

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