18

我正在使用 Web 服务将我们的后端系统与 Salesforce 集成。我在不同的 URL 上运行生产和舞台环境。我需要能够使 Web 服务调用的端点不同,具体取决于代码是在生产还是沙盒 Salesforce 实例中运行。

如何检测环境。

目前我正在考虑查找用户以查看用户名是否以“devsandbox”结尾,因为我无法识别可以查询以获取环境的系统对象。

进一步澄清:

我需要确定的位置在我在 Salesforce 中选择按钮时调用的 Apex 代码中。我的自定义控制器需要知道它是在生产环境还是沙盒 Salesforce 环境中运行。

4

10 回答 10

15

对于你们都通过搜索结果找到这个,有一个重要的更新。正如 Daniel Hoechst 在另一篇文章中指出的那样,SF 现在直接提供沙盒与生产信息:

在 Summer '14(版本 31.0)中,组织对象上有一个可用的新字段。

从组织限制 1 中选择 Id、IsSandbox

来自 New 和 Change Objects 下的发行说明:

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

InstanceName
IsSandbox
于 2014-10-08T18:51:02.767 回答
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 版本中寻找更新的答案,有一个新方法System.URL.getSalesforceBaseUrl().toExternalForm()返回当前 url。
您可以从那里工作以获取所需的所有信息。

这是文档的链接:http: //www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_url.htm

于 2011-06-23T14:35:22.577 回答
2

Login 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 中创建一个自定义对象,然后在其中存储一个指示沙箱或生产的值。然后,您的 Apex 代码可以查询该对象。一个建议是使用 Apex 静态构造函数来加载此信息并为请求缓存它。

我的另一个想法(但不想建议)是使用外部服务来确定 Apex 代码在哪里执行。这可能很难实现,因为每次销售队伍服务器场发生变化时,您的代码都会发生变化,但我只是想我会把它扔在那里。

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

在您的顶点代码中,您可以使用以下内容获取您所在的 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 StackExchange 上有一个类似的问题,用于检测您是否在沙盒中 -我们能否确定 Salesforce 实例是生产组织还是沙盒组织?

搜索问题类别的解决方案中,您可以使用 OrgId 中的 pod 标识符来确定您是否正在处理沙箱。

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

警告 Confector:这里最大的弱点是,当 Salesforce 将新的沙盒 pod 上线时,您需要更新已知沙盒 pod 的列表(因此坚持使用其他解决方案可能更安全)。

于 2013-03-06T00:12:53.750 回答
0

您可以使用来自 Salesforce 的权威 Michael Farrington 的以下代码块。

原始博客文章: Michael Farrington:我的方法在哪里

如果您在测试或沙盒环境中,此方法将返回 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 回答