Pregunta

estoy integrando nuestros sistemas back-end con Salesforce utilizando los servicios web. Tengo entornos de producción y de la etapa que se ejecutan en diferentes direcciones URL. Tengo que ser capaz de tener el punto final de la llamada de servicio web será diferente dependiendo de si el código se ejecuta en la producción o caja de arena ejemplo Salesforce.

¿Cómo puedo detectar el medio ambiente.

Actualmente estoy pensando en buscar un usuario para ver si ahí termina nombre de usuario en 'devsandbox' como he podido identificar un objeto del sistema que pueda consultar para obtener el medio ambiente.

Además aclaración:

La ubicación necesito determinar esto está dentro del código Apex que se invoca cuando selecciono un botón en Salesforce. Mi controlador personalizado necesita saber si se ejecuta en el entorno de Salesforce producción o caja de arena.

¿Fue útil?

Solución

Para todos ustedes a través de la búsqueda de este resultado de la búsqueda, hay una actualización importante. Como Daniel Hoechst señaló en otro post , SF ahora proporciona directamente caja de arena frente a la información de producción:

  

En verano '14, (versión 31.0), hay un nuevo campo disponible en el   objeto de organización.

     

SELECT ID, IsSandbox de límite Organización 1

     

A partir de las notas de la versión bajo nueva y Cambio Objetos:

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

InstanceName
IsSandbox

Otros consejos

Sobre la base de las respuestas parece que Salesforce no tiene un objeto del sistema que me puede decir si mi código Apex se está ejecutando en la producción o un entorno de pruebas.

Voy a proceder sobre la base de los siguientes supuestos:

  • Puedo leer el identificador de organización del entorno actual
  • El identificador de organización de mi sistema de producción siempre se mantendrá constante.
  • El identificador de organización de una caja de arena siempre será diferente a la producción (ya que son únicos)

El ID de organización actual se puede encontrar con System.getOrganizationId()

Mi solución es tener mi código comparar la corriente Identificación del organigrama de la producción representa un valor constante.

Estoy realizando la nigromancia aquí y la respuesta ya es aceptado, pero tal vez alguien se beneficiará de ella ...

Utilice uno de estos campos de fusión en su página Visualforce / S-Control:

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

Puede analizar fácilmente ID de organización fuera de ellos.

En el código Apex: UserInfo.getOrganisationId ()

Sé que esto es una entrada antigua, pero sólo por el bien de las personas que buscan una respuesta actualizada a partir de la primavera '11 liberación no es un nuevo método System.URL.getSalesforceBaseUrl (). ToExternalForm () que devuelve la URL actual.
Puede trabajar desde allí para obtener toda la información que necesita.

Aquí está el enlace a documentos: http: // www. salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_url.htm

La llamada de sesión API devuelve un elemento de caja de arena en la estructura LoginResult devuelto que indica si es un entorno de pruebas o no, desde el 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>

Areneros puede tener una URL personalizada (por ejemplo acme.cs1.my.salesforce.com), o podría ser anfitrión de una página Visualforce (cs2.visual.force.com) o ambos (acme.cs2.visual.force.com ) así que utilizo este método:

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

Creo que la forma más sencilla de hacerlo sería crear un objeto personalizado en Salesforce, y luego almacenar un valor que indica caja de arena o de producción allí. Su código Apex se puede consultar ese objeto. Una sugerencia sería utilizar constructores estáticos Apex a cargar esta información y almacenar en caché para la solicitud.

Otro pensamiento que tuve (pero odio sugerir) es utilizar un servicio externo para determinar dónde se encuentra ejecutando su código Apex. Esto probablemente sería difícil de lograr, ya que cada vez que el conjunto de servidores SalesForce cambia hay un cambio de su código se rompería, pero yo sólo pensé en tirar esto hacia fuera allí.

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

Hay que añadir " http://www.whatismyip.com " a la configuración del sitio remoto a conseguir que esto funcione (Configuración> Configuración de administración> Controles de seguridad> Configuración del sitio remoto). Este código debe ejecutarse en la ventana de depuración cuando se hace clic en "Registro del sistema".

En su código ápice puede utilizar el siguiente para obtener la instancia de SF que usted está en.

Manteniendo la dinámica se asegurará de que usted no tiene que actualizar el código cuando su organigrama se migra a una instancia diferente.

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

Hay una pregunta similar en el Salesforce StackExchange para detectar si se encuentra en un recinto de seguridad o no - podemos determinar si la instancia de Salesforce es org producción o una caja de arena org?

En las soluciones en busca de una categoría de problema , se puede usar el identificador de la vaina de la OrgID para determinar si se trata de una caja de arena.

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

Advertencia Confector: La gran debilidad es que tendrá que actualizar la lista de las vainas de conocimientos de recinto de seguridad como y cuando Salesforce trae otras nuevas en línea (lo que podría ser pegado más seguro con las otras soluciones) .

Puede utilizar el siguiente bloque de código de Michael Farrington una autoridad en Salesforce.

entrada del blog original aquí: Michael Farrington: ¿Dónde estoy Método

Este método devolverá cierto si usted está en un entorno de prueba o caja de arena y falso en caso contrario.

    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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top