18

Web サービスを使用して、バックエンド システムを Salesforce と統合しています。実稼働環境とステージ環境を異なる URL で実行しています。コードが本番環境で実行されているか、Salesforce インスタンスのサンドボックスで実行されているかによって、Web サービス呼び出しのエンドポイントが異なるようにする必要があります。

環境を検出するにはどうすればよいですか。

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

さらなる解明:

これを特定する必要がある場所は、Salesforce でボタンを選択したときに呼び出される Apex コード内です。カスタム コントローラは、Salesforce の本番環境またはサンドボックス環境で実行されているかどうかを知る必要があります。

4

10 に答える 10

12

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

次の仮定に基づいて続行します。

  • 現在の環境の組織IDを読み取ることができます
  • 私の本番システムの組織IDは常に一定のままです。
  • サンドボックスの組織IDは、本番環境とは常に異なります(一意であるため)。

現在の組織IDはで見つけることができますSystem.getOrganizationId()

私の解決策は、コードで現在の組織IDを本番環境を表す定数値と比較することです。

于 2009-10-11T16:18:26.770 に答える
3

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

Visualforceページ/S-Controlで次のマージフィールドのいずれかを使用します。

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

それらから組織IDを簡単に解析できます。

Apexコードの場合:UserInfo.getOrganisationId()

于 2010-04-13T21:19:42.173 に答える
3

これが古い投稿であることは知っていますが、Spring '11 リリースの時点で更新された回答を探している人のために、現在の URL を返す新しいメソッドSystem.URL.getSalesforceBaseUrl().toExternalForm()があります。
そこから作業して、必要なすべての情報を取得できます。

ドキュメントへのリンクは次のとおりです: http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_url.htm

于 2011-06-23T14:35:22.577 に答える
2

ログイン API 呼び出しは、返された LoginResult 構造にサンドボックス要素を返します。これは、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>
于 2009-10-02T05:04:18.757 に答える
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));
}   
于 2012-10-20T06:06:54.853 に答える
0

Salesforce のオーソリティである Michael Farrington の次のコード ブロックを使用できます。

元のブログ投稿はこちら: Michael Farrington: Where Am I Method

このメソッドは、テスト環境またはサンドボックス環境にいる場合は true を返し、それ以外の場合は false を返します。

    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;
}
于 2014-08-07T14:52:52.457 に答える
0

apex コードでは、以下を使用して、現在の SF のインスタンスを取得できます。

動的に保つことで、組織が別のインスタンスに移行されたときにコードを更新する必要がなくなります。

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);
于 2012-02-22T19:55:44.483 に答える
0

これを行う最も簡単な方法は、Salesforce でカスタム オブジェクトを作成し、そこにサンドボックスまたは運用を示す値を格納することだと思います。その後、Apex コードでそのオブジェクトを照会できます。1 つの提案は、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 」をリモート サイト設定に追加する必要があります ([設定] > [管理設定] > [セキュリティ コントロール] > [リモート サイト設定])。[システム ログ] をクリックすると、このコードがデバッグ ウィンドウで実行されます。

于 2009-10-08T17:37:25.297 に答える
0

サンドボックスにいるかどうかを検出するために、Salesforce StackExchange に同様の質問があります。Salesforceインスタンスが本番組織かサンドボックス組織かを判断できますか?

問題カテゴリを検索するソリューションでは、OrgId のポッド識別子を使用して、サンドボックスを扱っているかどうかを判断できます。

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

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

于 2013-03-06T00:12:53.750 に答える