سؤال

أنا دمج أنظمة نهاية ظهرنا مع Salesforce باستخدام خدمات الويب. لدي بيئات الإنتاج والمرحلة تعمل على عناوين URL مختلفة. أحتاج إلى أن أكون قادرا على أن تكون نقطة نهاية خدمة الويب مختلفة اعتمادا على ما إذا كان الرمز يعمل في مثيل SalesForce الإنتاج أو Sandbox.

كيف يمكنني اكتشاف البيئة.

حاليا أنا أفكر في البحث عن مستخدم لمعرفة ما إذا كان هناك اسم المستخدم ينتهي في "devsandbox" لأنني غير قادر على تحديد كائن نظام يمكنني الاستعلام عن الحصول على البيئة.

مزيد من التوضيح:

الموقع الذي أحتاج إلى تحديد ذلك داخل رمز APEX الذي تم استدعاءه عند تحديد زر في Salesforce. تحتاج وحدة التحكم المخصصة الخاصة بي إلى معرفة ما إذا كان يعمل في بيئة Salesforce الإنتاج أو Sandbox.

هل كانت مفيدة؟

المحلول

بالنسبة إلى Y'all عن طريق نتائج البحث، يوجد تحديث مهم. كما أشار دانيال هويشست وظيفة أخرى, يوفر SF Now مباشرة معلومات الإنتاج مقابل Sandbox:

في الصيف '14، (الإصدار 31.0)، هناك مجال جديد متاح في كائن المنظمة.

اختر المعرف، Issandbox من حد المؤسسة 1

من الملاحظات الإصدار ضمن كائنات جديدة وتغيير:

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

InstanceName
IsSandbox

نصائح أخرى

بناء على الردود، يبدو أن Salesforce لا يحتوي على كائن نظام يمكن أن تخبرني ما إذا كان رمز APEX الخاص بي قيد التشغيل أو بيئة رمل.

سأستمر بناء على الافتراضات التالية:

  • يمكنني قراءة معرف المنظمة للبيئة الحالية
  • سيظل معرف المنظمة لنظام الإنتاج الخاص بي ثابتا دائما.
  • ستكون معرف المنظمة لرمال Sand مختلفة دائما عن الإنتاج (لأنها فريدة من نوعها)

يمكن العثور على معرف المنظمة الحالية مع System.getOrganizationId()

حلاي هو الحصول على رمز بلدي مقارنة معرف ORG الحالي إلى القيمة الثابتة التي تمثل الإنتاج.

أقوم بأداء رصيف من النصائح هنا ويتم قبول الجواب بالفعل، ولكن ربما سيستفيد شخص ما من ذلك ...

استخدم إحدى حقول دمج هذه على صفحة VisualForce الخاصة بك / S-Control:

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

يمكنك بسهولة تحليل معرف المؤسسة منهم.

في رمز APEX: userinfo.getorganationid ()

أعلم أن هذا منصب قديم، ولكن فقط من أجل الأشخاص الذين يبحثون عن إجابة محدثة اعتبارا من إصدار الربيع "11" هناك طريقة جديدة system.url.getsalesalesforcebaseurl (). ToExternalForm () التي ترجع عنوان URL الحالي.
يمكنك العمل من هناك للحصول على جميع المعلومات التي تحتاجها.

إليك رابط المستندات: http://www.salesforce.com/us/developer/docs/apexcode/content/apex_methods_system_url.htm.

إرجاع دعوة 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>

قد يكون لدى صناديق الرمل عنوان 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));
}   

أعتقد أن أسهل طريقة للقيام بذلك ستكون لإنشاء كائن مخصص في Salesforce، ثم قم بتخزين قيمة تشير إلى Sandbox أو الإنتاج هناك. يمكن أن يسهل رمز APEX الخاص بك هذا الكائن. سيكون أحد الاقتراحات استخدام منشئين ثابتين APEX لتحميل هذه المعلومات وذاكرة التخزين المؤقت للطلب.

يعتقد آخر أن لدي (ولكن أكره أن أقترح) هو استخدام خدمة خارجية لتحديد مكان تنفيذ رمز 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."إلى إعدادات الموقع البعيد للحصول على هذا للعمل (الإعداد> إعداد الإدارة> عناصر تحكم الأمان> إعدادات الموقع البعيد). يجب تشغيل هذا الرمز في نافذة Debug عند النقر فوق" سجل النظام ".

في رمز APEX الخاص بك، يمكنك استخدام ما يلي للحصول على مثيل SF الذي أنت فيه.

إن إبقاء عليه ديناميكية سوف تأكد من أنك لست مضطرا لتحديث التعليمات البرمجية عند ترحيل ORG إلى مثيل مختلف.

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);

هناك سؤال مماثل حول Salesforce StackExchange للكشف عن إذا كنت في صندوق رمل أم لا - هل يمكن أن نحدد ما إذا كانت مثيل Salesforce هي إنتاج Org أو Org Randbox؟

في ال حلول بحثا عن فئة المشكلة, ، يمكنك استخدام معرف POD من Orgid لتحديد ما إذا كنت تتعامل مع صندوق رمل.

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

كاكز التحذير: الضعف الكبير هنا هو أنك ستحتاج إلى تحديث قائمة Pods معرفة Sandbox كما وعندما يجلب Salesforce من جديد عبر الإنترنت (لذلك قد يكون الأمر أكثر أمانا للحلول الأخرى).

يمكنك استخدام كتلة التعليمات البرمجية التالية من Michael Farrington وهي سلطة في Salesforce.

آخر بلوق وظيفة هنا: مايكل فارينغتون: أين أنا طريقة

ستعود هذه الطريقة صحيحة إذا كنت في بيئة اختبار أو Sandbox و 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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top