문제

웹 서비스를 사용하여 백엔드 시스템을 Salesforce와 통합하고 있습니다.다른 URL에서 실행되는 프로덕션 및 스테이지 환경이 있습니다.코드가 프로덕션 인스턴스에서 실행되는지 아니면 샌드박스 Salesforce 인스턴스에서 실행되는지에 따라 웹 서비스 호출의 끝점이 달라지도록 할 수 있어야 합니다.

환경을 어떻게 감지합니까?

현재 환경을 얻기 위해 쿼리할 수 있는 시스템 개체를 식별할 수 없기 때문에 사용자 이름이 'devsandbox'로 끝나는지 확인하기 위해 사용자를 찾는 것을 고려하고 있습니다.

추가 설명:

이를 결정해야 하는 위치는 Salesforce에서 버튼을 선택할 때 호출되는 Apex 코드 내에 있습니다.내 사용자 정의 컨트롤러는 프로덕션 또는 샌드박스 Salesforce 환경에서 실행되는지 알아야 합니다.

도움이 되었습니까?

해결책

검색 결과를 통해 이것을 찾기 위해서는 중요한 업데이트가 있습니다. Daniel Hoechst가 지적했듯이 다른 게시물, SF는 이제 샌드 박스 대 생산 정보를 직접 제공합니다.

14 년 여름 (버전 31.0)에는 조직 개체에 새로운 필드가 있습니다.

조직 제한에서 ID, IsSandbox를 선택하십시오 1

신규 및 변경 객체의 릴리스 노트에서 :

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

InstanceName
IsSandbox

다른 팁

응답에 따라 Salesforce에는 Apex 코드가 생산 또는 샌드 박스 환경에서 실행 중인지 알려주는 시스템 객체가없는 것으로 보입니다.

다음 가정을 바탕으로 진행하겠습니다.

  • 현재 환경의 조직 ID를 읽을 수 있습니다.
  • 내 생산 시스템의 조직 ID는 항상 일정하게 유지됩니다.
  • 샌드 박스의 조직 ID는 항상 생산과 다릅니다 (독특하기 때문에)

현재 조직 ID를 찾을 수 있습니다 System.getOrganizationId()

내 솔루션은 내 코드가 현재 조직 ID를 생산을 나타내는 상수 값과 비교하도록하는 것입니다.

나는 여기서 괴사를 수행하고 있고 대답은 이미 받아 들여지고 있지만 누군가가 그것으로부터 혜택을받을 것입니다 ...

VisualForce 페이지 / s- 통계 에서이 병합 필드 중 하나를 사용하십시오.

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

조직 ID를 쉽게 구문 분석 할 수 있습니다.

정점 코드 : userinfo.getorganisationId ()

나는 이것이 오래된 게시물이라는 것을 알고 있지만 Spring '11 릴리스 기준으로 업데이트 된 답변을 찾는 사람들을 위해 새로운 방법이 있습니다. system.url.getSalesforcebaseurl (). 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에서 사용자 정의 개체를 만든 다음 거기에 샌드박스 또는 프로덕션을 나타내는 값을 저장하는 것입니다.그러면 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"를 원격 사이트 설정으로 이동하여 이 작업을 수행합니다(설정 > 관리 설정 > 보안 제어 > 원격 사이트 설정).이 코드는 "시스템 로그"를 클릭하면 디버그 창에서 실행되어야 합니다.

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

Salesforce StackexChange에 샌드 박스에 있는지 여부를 감지하는 데 비슷한 질문이 있습니다. Salesforce 인스턴스가 생산 조직 또는 샌드 박스 조직인지 확인할 수 있습니까?

에서 문제 범주를 찾는 솔루션, Orgid의 POD 식별자를 사용하여 샌드 박스를 처리하는지 확인할 수 있습니다.

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

경고 혼동자 : 여기서 큰 약점은 Salesforce가 새로운 것을 온라인으로 가져올 때와 같이 알고있는 샌드 박스 포드 목록을 업데이트해야한다는 것입니다 (따라서 다른 솔루션을 더 안전하게 고수 할 수 있습니다).

Michael Farrington의 다음 코드 블록을 Salesforce에 대한 권한을 사용할 수 있습니다.

여기에 오리지널 블로그 게시물 : Michael Farrington : 내가 어디에 있습니까?

이 방법은 테스트 또는 샌드 박스 환경에 있고 그렇지 않으면 False가 있으면 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;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top