Question

Je l'intégration de nos systèmes dorsaux avec Salesforce en utilisant les services Web. J'ai des environnements de production et de la scène en cours d'exécution sur des URL différentes. Je dois être en mesure d'avoir le point final de l'être différent appel de service Web selon que le code est en cours d'exécution dans la production ou bac à sable par exemple Salesforce.

Comment détecter l'environnement.

Je suis actuellement à la recherche envisage un utilisateur pour voir si le nom d'utilisateur se termine par « devsandbox » comme je l'ai été incapable d'identifier un objet système que je peux interroger pour obtenir l'environnement.

D'autres précisions:

L'emplacement que je dois savoir est dans le code Apex qui est appelée lorsque je sélectionne un bouton dans Salesforce. Mon contrôleur personnalisé a besoin de savoir si elle en cours d'exécution dans l'environnement Salesforce production ou bac à sable.

Était-ce utile?

La solution

Pour vous tous trouver ce via les résultats de recherche, il y a une mise à jour importante. Comme Daniel Hoechst a dans un autre post, SF fournit désormais directement bac à sable par rapport à l'information de production:

  

En été '14, (version 31.0), il y a un nouveau champ disponible sur le   objet Organisation.

     

sélectionnez Id, IsSandbox de limite Organisation 1

     

D'après les notes de version sous de nouvelles et modifier les objets:

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

InstanceName
IsSandbox

Autres conseils

D'après les réponses, il semble que Salesforce ne dispose pas d'un objet système qui peut me dire si mon code Apex est en cours d'exécution dans la production ou dans un environnement de bac à sable.

Je vais reposeront sur l'hypothèses suivantes:

  • Je peux lire l'ID de l'organisation de l'environnement actuel
  • L'id organisation de mon système de production restera toujours constante.
  • L'identifiant de l'organisation d'un bac à sable sera toujours différent à la production (comme ils sont uniques)

L'ID de l'organisation actuelle peut être trouvé avec System.getOrganizationId()

Ma solution est d'avoir mon code comparer l'identifiant organisationnelle courante à la valeur constante représentant la production.

je joue ici nécromancie et la réponse est déjà accepté, mais peut-être que quelqu'un va en profiter ...

Utilisez l'un de ces champs de fusion sur votre page Visualforce / S-Control:

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

Vous pouvez facilement analyser à l'organisation ID d'eux.

Dans le code Apex: UserInfo.getOrganisationId ()

Je sais que c'est un ancien poste, mais juste pour le plaisir des personnes à la recherche d'une réponse mise à jour au printemps '11 il version est une nouvelle méthode System.URL.getSalesforceBaseUrl () toExternalForm (). qui renvoie l'URL actuelle.
Vous pouvez travailler à partir de là pour obtenir toutes les informations dont vous avez besoin.

Voici le lien vers docs: http: // www. salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_url.htm

L'appel API de connexion retourne un bac à sable dans la structure de LoginResult retourné qui indique si son un environnement de bac à sable ou non, à partir du 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>

Sandboxes peut avoir une URL personnalisée (par exemple acme.cs1.my.salesforce.com), ou peut-être une page d'accueil Visualforce (cs2.visual.force.com) ou les deux (acme.cs2.visual.force.com ) donc j'utiliser cette méthode:

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

Je pense que la meilleure façon de le faire serait de créer un objet personnalisé dans Salesforce, puis stocker une valeur indiquant qu'il bac à sable ou à la production. Votre code Apex peut alors interroger cet objet. Une suggestion serait d'utiliser les constructeurs statiques Apex pour charger ces informations et cache pour la demande.

Une autre pensée que j'avais (mais je déteste suggérer) est d'utiliser un service externe pour déterminer où votre code Apex est en cours d'exécution. Ce serait sans doute difficile à retirer, comme à chaque fois que la batterie de serveurs SalesForce change il y a un changement de votre code briserait, mais je pensais que je jetterais ce là-bas.

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

Vous devez ajouter " http://www.whatismyip.com " aux paramètres du site distant que cela fonctionne (Configuration> administration> Contrôles de sécurité> Paramètres du site à distance). Ce code doit être exécuté dans la fenêtre de débogage lorsque vous cliquez sur « System Log ».

Dans votre code apex vous pouvez utiliser ce qui suit pour obtenir l'instance de SF que vous êtes.

Le garder dynamique fera en sorte que vous ne devez pas mettre à jour votre code lorsque votre org est migré vers une autre instance.

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

Il y a une question similaire sur Salesforce StackExchange pour détecter si vous êtes dans un bac à sable ou non - Peut-on déterminer si l'instance Salesforce est org de production ou d'un Bac à sable org

Dans les solutions à la recherche d'une catégorie de problème , vous pouvez utiliser l'identifiant de pod du OrgID pour déterminer si vous faites affaire avec un bac à sable.

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

caveat Confector: La grande faiblesse est que vous devez mettre à jour la liste des gousses de sandbox savoir que quand Salesforce apporte de nouvelles en ligne (il pourrait être plus sûr de coller avec les autres solutions) .

Vous pouvez utiliser le bloc de code suivant de Michael Farrington une autorité sur Salesforce.

message blog ici: Michael Farrington: Où suis-je Méthode

Cette méthode retourne vrai si vous êtes dans un environnement de test ou bac à sable et false sinon.

    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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top