Introduction

Salesforce permet très facilement d’avoir une instance développeur pour tester certaines fonctionnalités du produit. Comme Salesforce est très utilisé par les entreprises, il s’agit d’une application représentative lors de nos démos pour du SSO, du provisioning, etc.

La documentation de Salesforce est assez complète mais elle ne relate pas toujours des spécificités de l’édition développeur. Voici quelques notes pour travailler avec Salesforce

Authentification API

Pour utiliser les API, on doit obtenir un jeton d’accès ou access token. Salesforce utilise OAuth2.0 et pour l’instant, j’ai réussi à faire fonctionner 2 méthodes:

  • Authorization Code

  • Refresh Token

Salesforce définit la notion d'"Application connectée". Pour créer une application, dans la partie Setup en Lightning, sous "Administration", aller dans Apps > App Manager et cliquer sur le bouton New Connected App.

Plus tard, il est possible d’éditer une application en allant, cette fois-ci en Classic, Build > Create > Apps, puis Edit sur l’application choisie.

Ainsi, il est possible de générer un Client ID et un Client Secret en cliquant sur le bouton Manage Consumer Details.

Authorization Code

Postman supporte cette méthode, ce qui est très pratique. Il y a un certain nombre de condition à remplir:

Même pour une instance Développeur, Les URL sont:

Echanger un code

Refresh Token

La génération d’un Refresh Token est un peu fastidieux mais permet des communications "Machine à Machine".

La première étape consiste à créer une application avec comme URL de redirection https://login.salesforce.com/. L’application doit avoir un scope "Perform requests at any time (refresh_token, offline_access)".

Créer l’URL de connexion de la forme https://login.salesforce.com/services/oauth2/authorize?response_type=code&client_id=<clientId>&redirect_uri=https://login.salesforce.com/&scope=offline_access en remplaçant <clientId> par celui de l’application générée.

En ouvrant cette URL dans le navigateur, après authentification et consentement, le navigateur est redirigé vers https://login.salesforce.com/ avec dans l’URL un paramètre code.

Récupéré la valeur du paramètre code. Attention, la valeur est URL-encodée. Il faut alors la URL-décoder (Notepad++ est ton ami par exemple).

A ce stade, il faut échanger le code contre des tokens. Pour ce faire, il suffit de faire un POST sur https://login.salesforce.com/services/oauth2/token avec les paramètres:

Echanger un code

En retour, un Refresh Token sera donné.

Etendre un objet

Il est très facile d’étendre un objet dans Salesforce. Sans rentrer dans les considération de vue, de sécurité, etc. on peut ajouter un nouvel attribut (ex: une référence externe) en allant dans Object Manager, puis pour l’objet souhaité Fields & Relationships.

Echanger un code

API SObjects

L’API SObjects permet de manipuler les objets Salesforce:

  • Description d’un objet (ses attributs)

  • Création d’un objet

  • Détail d’un objet

  • Récupération d’un objet par référence externe

L’URL de base est construite de la façon suivante

https://<instance>.develop.my.salesforce.com/services/data/<version>/sobjects/<Objet>/<Méthode>

En étant connecté à Salesforce, on accès par exemple à:

https://<instance>.develop.lightning.force.com/one/one.app

Les versions sont données en accédant à https://<instance>.develop.my.salesforce.com/services/data/. Au moment de la rédaction de cet article, la dernière version est v56.0.

Pour obtenir la liste des attributs d’un compte, on peut alors accéder à :

https://<instance>.develop.my.salesforce.com/services/data/<version>/sobjects/Account/describe

Il est possible d’obtenir un objet par sa référence interne (/sobjects/Account/<AccountId) ou une référence externe (/sobjects/Account/Business_Partner_Code__c/TEST1).

API de requête

Pour requêter (lister) des objets, Salesforce a défini le Salesforce Object Query Language (SOQL) qui s’apparente fortement au SQL.

Pour lister les comptes on peut par exemple exécuter

https://<instance>.develop.my.salesforce.com/services/data/<version>/query?q=SELECT Name FROM Account WHERE Name='TEST1'

API Composite

Il est possible de chaîner des requêtes qui peuvent ainsi se référencer les unes avec les autres.

On peut donc imaginer :

  1. Rechercher un compte

  2. Créer un contact dans ce compte

  3. Créer un utilisateur associé

La requête composite est rendue "transactionnelle" avec le flag allOrNone.

Ci-dessous

{
    "allOrNone": true,
    "compositeRequest": [
        {
            "method": "GET",
            "url": "/services/data/v56.0/sobjects/Account/Business_Partner_Code__c/TEST1",
            "referenceId": "refAccount"
        },
        {
            "method": "POST",
            "url": "/services/data/v56.0/sobjects/Contact",
            "referenceId": "xxx",
            "body": {
                "LastName": "Fernandez",
                "FirstName": "Linda",
                "AccountId": "@{refAccount.Id}",
                "Email": "XXX@yopmail.com"
            }
        },
        {
            "method": "POST",
            "url": "/services/data/v56.0/sobjects/User",
            "referenceId": "newUser",
            "body": {
                "LastName": "Fernandez",
                "FirstName": "Linda",
                "ContactId": "@{newContact.id}",
                "Email": "XXX@yopmail.com",
                "EmailEncodingKey": "UTF-8",
                "ProfileId": "00eDn000001vctqIAA",
                "Username": "XXX@yopmail.com",
                "Alias": "LFernand",
                "TimeZoneSidKey": "America/Los_Angeles",
                "LocaleSidKey": "en_US",
                "LanguageLocaleKey": "en_US"
            }
        }
    ]
}
La casse est importante et pas toujours cohérente. Ainsi, dans le contact créé, il faut utiliser id mais pour récupérer l’Id du compte précédemment recherché, il faut utiliser Id.
Le retour de la requête composite donne le retour de chaque requête. En créant sa requête composite progressivement, on peut voir le retour et y faire référence plus facilement.

Conclusion

Salesforce dispose d’une documentation propre assez riche et d’une multitude de contenu par sa communauté. Voici ma contribution 😆.