2009-10-02 36 views
15

私はWebサービスを使用して、当社のバックエンドシステムをSalesforceと統合しています。私は、プロダクション環境とステージ環境が異なるURLで動作しています。 Webサービスコールのエンドポイントを、コードが本番環境のSalesforceインスタンスかサンドボックスSalesforceインスタンスのどちらで実行されているかによって異なるようにする必要があります。Salesforceで環境を検出するにはどうすればよいですか?

どのように環境を検出しますか。

現在、環境を取得するためにクエリできるシステムオブジェクトを特定できないため、ユーザー名が「devsandbox」で終わるかどうかを調べることを検討しています。

さらに明確化:私は、これは私はSalesforceのボタンを選択したときに呼び出されるApexコードの範囲内であるかを決定する必要が

場所。私のカスタムコントローラは、Salesforce環境のサンドボックス環境で動作しているかどうかを知る必要があります。

+0

あなたは両方のURLを知っている場合は、その理由だけで場所を確認するためにあなたの現在のURLをチェックしませんがあなたは? –

+0

私のカスタムコントローラ内のApexコードは、呼び出されたページのURLにどうやって入りますか? –

答えて

11

検索結果でこれを確認するには、重要な更新があります。ダニエル・ヘキストはanother postで指摘したように、SFは今直接生産情報対サンドボックスを提供しています。夏'14、(バージョン31.0)で

、 組織オブジェクトで利用可能な新しいフィールドがあります。

オブジェクトの新規および変更の下でリリースノートから1

組織の制限からID、IsSandbox選択:

The Organization object has the following new read-only fields. 

InstanceName 
IsSandbox 
2

Login API呼び出しは、返されたLoginResult構造体のsandbox要素を返します。この構造体は、WSDLからサンドボックス環境かどうかを示します。

 <complexType name="LoginResult"> 
      <sequence> 
       <element name="metadataServerUrl" type="xsd:string" nillable="true"/> 
       <element name="passwordExpired" type="xsd:boolean" /> 
       <element name="sandbox"  type="xsd:boolean"/> 
       <element name="serverUrl"   type="xsd:string" nillable="true"/> 
       <element name="sessionId"   type="xsd:string" nillable="true"/> 
       <element name="userId"   type="tns:ID" nillable="true"/> 
       <element name="userInfo"   type="tns:GetUserInfoResult" minOccurs="0"/> 
      </sequence> 
     </complexType> 
+0

これはバックエンドで動作しますが、私の問題はカスタムコントローラで、どのバックエンドWebサービスを呼び出すかを決定する必要があります –

0

これを行う最も簡単な方法は、Salesforceでカスタムオブジェクトを作成し、そこにサンドボックスまたはプロダクションを示す値を保存することだと思います。 Apexコードはそのオブジェクトを照会できます。 Apexの静的コンストラクタを使用してこの情報をロードし、要求に応じてキャッシュすることをお勧めします。

もう1つは、外部サービスを使用してApexコードの実行場所を判断することでした。 SalesForceサーバーファームが変更されるたびにコードが破損する可能性があるたびに、これを実行するのは難しいでしょう。

HttpRequest req = new HttpRequest(); 
req.setEndpoint('http://www.whatismyip.com/automation/n09230945.asp'); 
req.setMethod('GET'); 

Http http = new Http(); 
HTTPResponse res = http.send(req); 
System.debug(res.getBody()); 

あなたはこの仕事にする([設定]> [管理者設定]> [セキュリティのコントロール]> [リモートサイトの設定])を取得するためにリモートサイトの設定に「http://www.whatismyip.com」を追加する必要があります。このコードは、「システムログ」をクリックすると、デバッグウィンドウで実行する必要があります。

+0

私はすでに最初のものを考えていましたが、サンドボックスが毎回手動で変更される必要があるリフレッシュ。この手動アップデートを紛失するコストは、ステージ/テストデータがバックエンドの生産に移行することです。 2番目のオプションは興味深いですが、安定していないと言っています。 –

12

回答に基づいて、Salesforceには、Apexコードが本番環境で動作しているのか、サンドボックス環境で動作しているのかを教えてくれるシステムオブジェクトがないようです。

私は、以下の仮定に基づいて続行するつもりです:

  • 私は現在の環境の組織ID
  • 私の生産システムの組織IDが常に一定のままで読むことができます。
  • (彼らは一意であるとして)サンドボックスの組織IDが常に生産に異なるだろう

IDが私のソリューションは、私のコードを持つことであるSystem.getOrganizationId()

で見つけることができる現在の組織は、現在を比較org idを生成を表す定数値に置き換えます。

+2

あなたが知っている限り、これらはすべて有効な前提となりましたか? –

+0

Salesforceは、コンテキストに応じて組織IDを別々に保存することに注意してください。http://stackoverflow.com/questions/3213470/salesforce-com-id-attribute-seems-to-have-a-15-and-18-character-値:whats-the – chris

+0

UserInfo.getOrganizationId() – ttt

3

私はここでネクロマンシーを行っていますが、答えはすでに受け入れられていますが、誰かがそれから恩恵を受けるかもしれません...

使用これらのいずれかのあなたのVisualforceページ/ S-Controlのフィールドをマージ:

{!$Api.Enterprise_Server_URL_180}, {!$Api.Partner_Server_URL_180}, {!$Api.Session_ID} 

あなたは簡単にそれらのうちの組織IDを解析することができます。 Apexコードで

UserInfo.getOrganisationId()

3

私はこれは古い記事ですけど、ちょうど更新の答えを探している人々のために新しい方法System.URL.getSalesforceBaseUrlがある春'11リリースのよう().toExternalForm()現在のURLを返します。
そこから作業して、必要なすべての情報を入手できます。ここで

は、ドキュメントへのリンクです:あなたがしているSFのインスタンスを取得するには、以下を使用することができ、あなたのApexコードでhttp://www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_url.htm

+0

参照先:public Boolean isSandbox(){ return URL.getSalesforceBaseUrl()。getHost()。left(2).equalsignorecase( 'cs'); } – ceiroa

0

ダイナミックそれを維持あなたが持っていないことを確認します組織が別のインスタンスに移行されたときにコードを更新します。

String s = System.URL.getSalesforceBaseUrl().getHost(); 
//this will return "na1.salesforce.com" or "na1-api.salesforce.com", 
// where na1 is your instance of SF, and -api may be there depending on where you run this 
s = s.substring(0,s.indexOf('.')); 
if(s.contains('-')) 
{ 
    s = s.substring(0,s.indexOf('-')); 
} 
system.debug(s); 
2

サンドボックスは、パーソナライズされたURL(例えばacme.cs1.my.salesforce.com)を有していてもよい、またはVisualforceページ(cs2.visual.force.com)または両方(acme.cs2.visualをホスティングしている可能性があります.force.com)ので、私は、このメソッドを使用します。あなたはサンドボックスでされているかどうか

public static Boolean isRunningInSandbox() { 
    String s = System.URL.getSalesforceBaseUrl().getHost(); 
    return (Pattern.matches('(.*\\.)?cs[0-9]*(-api)?\\..*force.com',s)); 
} 
0

検出するためのSalesforce StackExchangeにも同様の質問があります - solutions in search of a problem categoryCan we determine if the Salesforce instance is production org or a Sandbox org?

を、あなたが使用することができますあなたがサンドボックスを扱っているかどうかを判断するために、OrgIDのポッド識別子。

string podId = UserInfo.getOrganizationId().substring(3,4); 
boolean isSandbox = 'TSRQPONMLKJZVWcefg'.contains(podId); 
System.debug('IsSandbox: ' + isSandbox); 

警告Confector:ここには大きな弱点はあなたに知っているサンドボックスポッドのリストを更新する必要がありますということで、Salesforceは、オンラインで新しいものをもたらしたときに(それは他のソリューションとの安全なスティッキングかもしれません)。

0

マイケル・ファリントンの次のコードブロックをSalesforceの権限として使用することができます。ここ

オリジナルのブログ記事:Michael Farrington: Where Am I Method

あなたがテストまたはサンドボックス環境で、偽であれば、この方法は、そうでない場合はtrueを返します。

public Static Boolean isSandbox(){ 

    String host = URL.getSalesforceBaseUrl().getHost(); 
    String server = host.substring(0,host.indexOf('.')); 

    // It's easiest to check for 'my domain' sandboxes first 
    // even though that will be rare 
    if(server.contains('--')) 
     return true; 

    // tapp0 is a unique "non-cs" server so we check it now 
    if(server == 'tapp0') 
     return true; 

    // If server is 'cs' followed by a number it's a sandbox 
    if(server.length()>2){ 
     if(server.substring(0,2)=='cs'){ 
      try{ 
       Integer.valueOf(server.substring(2,server.length())); 
      } 
      catch(exception e){ 
       //started with cs, but not followed by a number 
       return false; 
      } 

      //cs followed by a number, that's a hit 
      return true; 
     } 
    } 

    // If we made it here it's a production box 
    return false; 
} 
関連する問題