Suivez votre progression
Accueil Trailhead
Accueil Trailhead

Services Web Apex

Objectifs de formation

Après avoir terminé ce module, vous pourrez :
  • Décrire les deux types de services Web Apex et exposer une présentation à haut niveau de ces services.
  • Créer une classe REST Apex contenant des méthodes pour chaque méthode HTTP.
  • Invoquer une méthode REST Apex personnalisée avec un point de terminaison.
  • Transmettre des données à une méthode REST Apex personnalisée en envoyant un corps de requête au format JSON.
  • Développer une méthode test pour une méthode REST Apex et définir les propriétés d’une requête REST de test.
  • Développer une méthode test pour une méthode REST Apex puis l’appeler avec des valeurs de paramètres.

Exposer votre classe Apex en tant que service Web

Vous pouvez exposer vos méthodes de classe Apex en tant qu’opération de service Web REST ou SOAP. Si vous faites en sorte que vos méthodes puissent être appelées via le Web, vos applications externes peuvent intégrer Salesforce pour effectuer toutes sortes d’opérations géniales.

Par exemple, disons que le centre d’appel de votre entreprise utilise une application interne pour gérer les ressources sur site. Les représentants de l’assistance clientèle sont supposés utiliser la même application pour effectuer leur travail quotidien, y compris pour gérer les enregistrements de requêtes dans Salesforce. En employant une seule interface, les représentants peuvent consulter et mettre à jour les enregistrements de requêtes et accéder aux ressources internes. L’application appelle une classe de service Web Apex pour gérer les enregistrements de requêtes Salesforce.

Exposer une classe en tant que service REST

La procédure permettant de rendre votre classe Apex accessible en tant que service Web REST est directe. Définissez votre classe en tant que classe globale, et définissez vos méthodes en tant que méthodes statiques globales. Ajoutez des annotations à la classe et aux méthodes. Dans notre exemple, la classe REST Apex utilise une seule méthode. La méthode getRecord est un appel d’API REST personnalisé. Elle est annotée par @HttpGet et invoquée pour une requête GET.

@RestResource(urlMapping='/Account/*')
global with sharing class MyRestResource {
    @HttpGet
    global static Account getRecord() {
        // Add your code
    }
}

Comme vous pouvez le voir, la classe est annotée avec @RestResource(urlMapping='/Account/*). Le point de terminaison de base pour le REST Apex est https://votreInstance.salesforce.com/services/apexrest/. Le mappage d’URL est ajouté au point de terminaison de base pour constituer le point de terminaison pour votre service REST. Ici, dans l’exemple de classe, le point de terminaison REST est https://votreInstance.salesforce.com/services/apexrest/. Pour votre organisation, elle pourrait ressembler à https://votreInstance.salesforce.com/services/apexrest/Account/*.

Le mappage d’URL est sensible à la casse et peut contenir un caractère générique (*).

Définissez chaque méthode exposée en tant que méthode statique globale et ajoutez une annotation pour l’associer à une méthode HTTP. Les annotations suivantes sont disponibles. Vous ne pouvez utiliser chacune des annotations qu’une fois par classe Apex.

Annotation Action Détails
@HttpGet Lire Lit ou récupère les enregistrements.
@HttpPost Créer Crée des enregistrements.
@HttpDelete Supprimer Supprime des enregistrements.
@HttpPut Upsert Généralement utilisée pour mettre à jour des enregistrements existants ou en créer de nouveaux.
@HttpPatch Mettre à jour Généralement utilisée pour mettre à jour des champs des enregistrements existants.

Exposer une classe en tant que service SOAP

La procédure permettant de rendre votre classe Apex accessible en tant que service Web SOAP est aussi simple que pour le REST. Définissez votre classe en tant que classe globale. Ajoutez le mot clé webservice et le modificateur de définition static à chacune des méthodes que vous souhaitez exposer. Le mot clé webservice offre un accès global à la méthode à laquelle il est ajouté.

Voici un exemple de classe avec une seule méthode. La méthode getRecord est un appel d’API SOAP personnalisé retournant un enregistrement Compte.

global with sharing class MySOAPWebService {
    webservice static Account getRecord(String id) {
        // Add your code
    }
}

L’application externe peut appeler vos méthodes Apex personnalisées en tant qu’opérations de service Web en exploitant le fichier WSDL de la classe. Générez ce fichier WSDL pour votre classe à partir de la page de détails de la classe. Vous pouvez y accéder depuis la page Classes Apex de Configuration. Vous envoyez généralement le fichier WSDL à des développeurs tiers (ou vous l’utilisez vous-même) afin de développer des intégrations pour votre service Web.

La sécurité de la plate-forme étant au cœur des préoccupations de Salesforce, une authentification est nécessaire pour votre service Web. En plus du fichier WSDL de la classe Apex, les applications externes doivent utiliser le fichier WSDL de l’entreprise ou du partenaire pour la fonctionnalité de connexion.

Procédure REST Apex

Et maintenant, amusons-nous. Les quelques prochaines étapes vous guideront tout au long du processus de création d’un service REST Apex. Pour commencer, vous allez créer la classe Apex exposée en tant que service REST. Ensuite, vous essaierez d’appeler quelques méthodes à partir d’un client, et enfin, vous développerez les tests de l’unité. Ça fait pas mal de code, mais vos efforts seront récompensés !

Votre classe Apex gère les enregistrements de requête. Cette classe contient cinq méthodes, et chacune d’elles correspond à une méthode HTTP. Par exemple, lorsque l’application client invoque un appel REST pour la méthode HTTP GET, la méthode getCaseById est invoquée.

La classe étant définie avec un mappage d’URL de /Cases/*, le point de terminaison utilisé pour appeler ce service REST est un URI commençant par https://votreInstance.salesforce.com/services/apexrest/Cases/.

Nous vous suggérons également d’envisager un contrôle de version de vos points de terminaison d’API afin que vous puissiez améliorer une fonctionnalité sans endommager le code existant. Vous pourriez créer deux classes spécifiant les mappages d’URL de /Cases/v1/* et /Cases/v2/* pour implémenter cette fonctionnalité.

Commençons par créer une classe REST Apex.

  1. Ouvrez la Developer Console depuis l’icône Configuration (Icône d’engrenage de configuration).
  2. Dans la Developer Console, sélectionnez Fichier | Nouveau | Classe Apex.
  3. Saisissez le nom de classe CaseManager, puis cliquez sur OK.
  4. Remplacez le code généré automatiquement par la définition de classe suivante :
    @RestResource(urlMapping='/Cases/*')
    global with sharing class CaseManager {
    
        @HttpGet
        global static Case getCaseById() {
            RestRequest request = RestContext.request;
            // grab the caseId from the end of the URL
            String caseId = request.requestURI.substring(
              request.requestURI.lastIndexOf('/')+1);
            Case result =  [SELECT CaseNumber,Subject,Status,Origin,Priority
                            FROM Case
                            WHERE Id = :caseId];
            return result;
        }
    
        @HttpPost
        global static ID createCase(String subject, String status,
            String origin, String priority) {
            Case thisCase = new Case(
                Subject=subject,
                Status=status,
                Origin=origin,
                Priority=priority);
            insert thisCase;
            return thisCase.Id;
        }   
    
        @HttpDelete
        global static void deleteCase() {
            RestRequest request = RestContext.request;
            String caseId = request.requestURI.substring(
                request.requestURI.lastIndexOf('/')+1);
            Case thisCase = [SELECT Id FROM Case WHERE Id = :caseId];
            delete thisCase;
        }     
    
        @HttpPut
        global static ID upsertCase(String subject, String status,
            String origin, String priority, String id) {
            Case thisCase = new Case(
                    Id=id,
                    Subject=subject,
                    Status=status,
                    Origin=origin,
                    Priority=priority);
            // Match case by Id, if present.
            // Otherwise, create new case.
            upsert thisCase;
            // Return the case ID.
            return thisCase.Id;
        }
    
        @HttpPatch
        global static ID updateCaseFields() {
            RestRequest request = RestContext.request;
            String caseId = request.requestURI.substring(
                request.requestURI.lastIndexOf('/')+1);
            Case thisCase = [SELECT Id FROM Case WHERE Id = :caseId];
            // Deserialize the JSON string into name-value pairs
            Map<String, Object> params = (Map<String, Object>)JSON.deserializeUntyped(request.requestbody.tostring());
            // Iterate through each parameter field and value
            for(String fieldName : params.keySet()) {
                // Set the field and value on the Case sObject
                thisCase.put(fieldName, params.get(fieldName));
            }
            update thisCase;
            return thisCase.Id;
        }    
    
    }
  5. Appuyez sur CTRL+S pour enregistrer.

Créer un enregistrement avec une méthode POST

Utilisons la classe REST Apex que vous venez de créer, et amusons-nous un peu. Pour commencer, nous allons appeler la méthode POST pour créer un enregistrement de requête.

Pour invoquer votre service REST, vous devez utiliser… un client REST ! Vous pouvez employer pratiquement n’importe quel client REST, par exemple, votre propre client d’API, l’outil de ligne de commande cURL ou la bibliothèque curl pour PHP. Nous allons utiliser l’outil Workbench comme application cliente REST, mais nous jetterons ensuite également un œil à cURL.

Le REST Apex prend en charge deux formats pour les représentations de ressources : JSON et XML. Par défaut, les représentations JSON sont transmises dans le corps d’une requête ou d’une réponse, et le format est indiqué par la propriété Content-Type de l’en-tête HTTP. Le JSON étant plus facile à lire et à comprendre que le XML, cette unité utilise exclusivement le JSON. À cette étape, vous envoyez un enregistrement de requête au format JSON.

Le REST Apex prend en charge OAuth 2.0 et les mécanismes d’authentification de session. Pour le dire simplement, cela signifie que nous utilisons les normes de l’industrie pour que votre application et vos données restent sécurisées. Heureusement, vous pouvez utiliser Workbench pour simplifier les tests. Workbench est une suite d’outils Web performants qui offre la possibilité aux administrateurs et développeurs d’interagir avec des organisations via des API Lightning Platform. Avec Workbench, vous utilisez l’authentification de session lorsque vous vous connectez à Salesforce avec votre nom d’utilisateur et votre mot de passe. Et vous employez REST Explorer pour appeler votre service REST.

  1. Naviguez vers https://workbench.developerforce.com/login.php.
  2. Pour Environnement, sélectionnez Production.
  3. Sélectionnez la toute dernière version d’API dans la liste déroulante Version d’API.
  4. Acceptez les conditions du service, cliquez sur Login with Salesforce.
  5. Pour permettre au Workbench d'accéder à vos informations, cliquez sur Allow.
  6. Saisissez vos informations de connexion, puis cliquez sur Se connecter à Salesforce.
  7. Une fois connecté, sélectionnez Utilitaires | REST Explorer.
  8. Sélectionnez POST.
  9. Le chemin d’URL que REST Explorer accepte est relatif à l’URL d’instance de votre organisation. Ne fournissez que le chemin ajouté à l’URL d’instance. Dans le champ d’entrée d’URI relatif, remplacez l’URI par défaut par /services/apexrest/Cases/.
  10. Pour le corps de la requête, insérez la représentation de chaîne JSON suivante qui concerne l’objet à insérer.
    {
      "subject" : "Bigfoot Sighting!",
      "status" : "New",
      "origin" : "Phone",
      "priority" : "Low"
    }
  11. Cliquez sur Exécuter.
    Cette invocation appelle la méthode associée à la méthode HTTP POST, c’est-à-dire la méthode createCase.
  12. Pour afficher la réponse retournée, cliquez sur Afficher la réponse brute.
    La réponse retournée sera similaire à cette réponse. La réponse contient l’ID du nouvel enregistrement de requête. Votre valeur d’ID sera probablement différente de 50061000000t7kYAAQ. Enregistrez votre valeur d’ID à utiliser lors des étapes suivantes.
    HTTP/1.1 200 OK
    Date: Wed, 07 Oct 2015 14:18:20 GMT
    Set-Cookie: BrowserId=F1wxIhHPQHCXp6wrvqToXA;Path=/;Domain=.salesforce.com;Expires=Sun, 06-Dec-2015 14:18:20 GMT
    Expires: Thu, 01 Jan 1970 00:00:00 GMT
    Content-Type: application/json;charset=UTF-8
    Content-Encoding: gzip
    Transfer-Encoding: chunked
    
    "50061000000t7kYAAQ" 

Récupération de données avec une méthode GET personnalisée

En suivant des étapes similaires aux précédentes, utilisez Workbench pour invoquer la méthode HTTP GET.

  1. Dans Workbench, sélectionnez GET.
  2. Entrez l’URI /services/apexrest/Cases/<ID d’enregistrement>, en remplaçant <ID d’enregistrement> par l’ID de l’enregistrement que vous avez créé à l’étape précédente.
  3. Cliquez sur Exécuter.

    Cette invocation appelle la méthode associée à la méthode HTTP GET, c’est-à-dire la méthode getCaseById.

  4. Pour afficher la réponse retournée, cliquez sur Afficher la réponse brute.

    La réponse retournée sera similaire à cette réponse. La réponse contient les champs que la méthode a demandés pour le nouvel enregistrement de requête.

    HTTP/1.1 200 OK
    Date: Wed, 07 Oct 2015 14:28:20 GMT
    Set-Cookie: BrowserId=j5qAnPDdRxSu8eHGqaRVLQ;Path=/;Domain=.salesforce.com;Expires=Sun, 06-Dec-2015 14:28:20 GMT
    Expires: Thu, 01 Jan 1970 00:00:00 GMT
    Content-Type: application/json;charset=UTF-8
    Content-Encoding: gzip
    Transfer-Encoding: chunked
    
    {
      "attributes" : {
        "type" : "Case",
        "url" : "/services/data/v34.0/sobjects/Case/50061000000t7kYAAQ"
      },
      "CaseNumber" : "00001026",
      "Subject" : "Bigfoot Sighting!",
      "Status" : "New",
      "Origin" : "Phone",
      "Priority" : "Low",
      "Id" : "50061000000t7kYAAQ"
    }
    

Récupérer des données à l’aide de cURL

Tous les bons développeurs doivent savoir au moins trois choses : 1) comment créer un GIF animé de vous en train de manger une glace ; 2) la valeur de pi à 25 décimales près ; et 3) comment utiliser cURL. Les deux premières n’entrent pas dans le cadre de ce module, alors concentrons-nous sur la dernière.

cURL est un outil par ligne de commande permettant d’obtenir ou d’envoyer des fichiers en utilisant une syntaxe d’URL. Il s’avère très pratique lorsque vous travaillez avec des points de terminaison REST. Au lieu d’utiliser Workbench pour votre service REST Apex, vous utiliserez cURL pour invoquer la méthode HTTP GET. Chaque fois que vous « cURLez » votre point de terminaison REST, vous transmettez l’ID de session pour autorisation. Vous étiez gâté lorsque vous travailliez dans Workbench car cette application transmettait l’ID de session pour vous, en coulisse, une fois que vous vous connectiez.

Pour obtenir un ID de session, vous commencez par créer une application connectée dans votre organisation Salesforce, puis vous activez OAuth. Votre application cliente, cURL dans le cas présent, utilise l'application connectée pour se connecter à Salesforce. Pour créer une application connectée qui fournit la clé consommateur et le secret consommateur dont vous avez besoin pour obtenir votre ID de session, suivez ces instructions. Lors de la sélection des étendues OAuth de votre application connectée, choisissez l'étendue « Accéder à et gérer vos données (api) ». La configuration de l'application connectée peut prendre de 5 à 10 minutes. Lorsqu'elle est prête, utilisez la commande cURL suivante avec vos identifiants et l'application connectée.

curl -v https://login.salesforce.com/services/oauth2/token -d "grant_type=password" -d "client_id=<your_consumer_key>" -d "client_secret=<your_consumer_secret>" -d "username=<your_username>" -d "password=<your_password_and_security_token>" -H 'X-PrettyPrint:1'

Si la procédure réussit, le résultat contient access_token, qui correspond à votre ID de session, et instance_url de votre organisation.

Réponse cURL avec un jeton d'accès

Saisissez maintenant votre commande cURL, similaire à la commande ci-dessous, pour appeler votre service REST Apex et renvoyer les informations sur la requête.

curl https://yourInstance.salesforce.com/services/apexrest/Cases/<Record_ID> -H "Authorization: Bearer <your_session_id>" -H "X-PrettyPrint:1"

Lorsque vous aurez appuyé sur Entrée, vous verrez quelque chose comme : Maintenant que vous êtes expert en ligne de commande, n’hésitez pas à utiliser cURL, jq, sed, awk et grep au gré de vos envies. Pour plus d’infos sur cURL, reportez-vous à la section Ressources.

cURL et réponse de la ligne de commande

Mettre à jour des données avec une méthode PUT ou PATCH personnalisée

Vous pouvez mettre à jour des enregistrements avec la méthode HTTP PUT ou PATCH. La méthode PUT met à jour l’intégralité de la ressource si elle existe ou crée la ressource si elle n’existe pas. PUT est essentiellement une méthode d’upsert. La méthode PATCH ne met à jour que les portions spécifiées d’une ressource existante. En Apex, les opérations de mise à jour ne mettent à jour que les champs spécifiés et n’écrasent pas l’intégralité de l’enregistrement. Nous allons développer un peu de code Apex pour déterminer si nos méthodes procèdent à une mise à jour ou à un upsert.

Mettre à jour des données avec la méthode PUT

La méthode upsertCase que vous avez ajoutée à la classe CaseManager implémente l’action PUT. Cette méthode est incluse ici afin que vous puissiez vous y reporter. La méthode utilise la méthode DML Apex upsert intégrée pour créer ou remplacer les champs d’enregistrement de requête en associant la valeur d’ID. Si un ID est envoyé dans le corps de la requête, il remplit le sObject. Sinon, le sObject est créé sans ID. La méthode upsert est invoquée avec le sObject de la requête rempli, et l’instruction DML fait le reste. Voilà !

@HttpPut
global static ID upsertCase(String subject, String status,
    String origin, String priority, String id) {
    Case thisCase = new Case(
        Id=id,
        Subject=subject,
        Status=status,
        Origin=origin,
        Priority=priority);
    // Match case by Id, if present.
    // Otherwise, create new case.
    upsert thisCase;
    // Return the case ID.
    return thisCase.Id;
}
Pour invoquer la méthode PUT :
  1. Dans Workbench REST Explorer, sélectionnez PUT.
  2. Pour l’URI, entrez /services/apexrest/Cases/.
  3. La méthode upsertCase s’attend à ce que les valeurs de champ soient transmises dans le corps de la requête. Ajoutez ce qui suit pour le corps de la requête, puis remplacez <ID d’enregistrement> par l’ID d’enregistrement de requête que vous avez créé précédemment.
    {
      "id": "<Record_ID>",
      "status" : "Working",
      "subject" : "Bigfoot Sighting!",
      "priority" : "Medium"
    }
    Remarque

    Remarque

    Le champ ID est facultatif. Pour créer un enregistrement de requête, omettez ce champ. Dans notre exemple, vous transmettez ce champ car vous souhaitez mettre à jour l’enregistrement de requête.

  4. Cliquez sur Exécuter.

    Cette requête invoque la méthode upsertCase de votre service REST. Les champs État, Objet et Priorité sont mis à jour. L’objet est mis à jour, même si sa valeur correspond à l’ancien objet. Par ailleurs, étant donné que le corps de la requête ne contenait pas de valeur pour le champ Origine de la requête, le paramètre origine de la méthode upsertCase est nul. Par conséquent, lorsque l’enregistrement est mis à jour, le champ Origine est effacé.

    Pour vérifier ces champs, affichez cet enregistrement dans Salesforce en naviguant vers https://yourInstance.salesforce.com/<ID d’enregistrement>.

Mettre à jour des données avec la méthode PATCH

Comme alternative à la méthode PUT, vous pouvez utiliser la méthode PATCH afin de mettre à jour les champs d’enregistrement. Vous pouvez implémenter la méthode PATCH de différentes manières. L’une d’entre elles consiste à spécifier les paramètres dans la méthode pour chaque champ à mettre à jour. Par exemple, vous pouvez créer une méthode pour mettre à jour la priorité d’une requête avec cette signature : updateCasePriority(String priority). Pour mettre à jour plusieurs champs, vous pouvez lister tous les champs souhaités ne tant que paramètres.

Une autre approche, qui offre plus de flexibilité, consiste à transmettre les champs en tant que paires nom/valeur JSON dans le corps de la requête. De cette manière, la méthode peut accepter un nombre arbitraire de paramètres, et les paramètres ne sont pas fixes dans la signature de la méthode. Un autre avantage de cette approche, c’est qu’aucun champ n’est effacé accidentellement du simple fait que sa valeur est nulle. La méthode updateCaseFields que vous avez ajoutée à la classe CaseManager utilise cette deuxième approche. Cette méthode désérialise la chaîne JSON du corps de la requête en un mappage de paires nom/valeur et utilise la méthode PUT de sObject pour définir les champs.

@HttpPatch
global static ID updateCaseFields() {
    RestRequest request = RestContext.request;
    String caseId = request.requestURI.substring(
        request.requestURI.lastIndexOf('/')+1);
    Case thisCase = [SELECT Id FROM Case WHERE Id = :caseId];
    // Deserialize the JSON string into name-value pairs
    Map<String, Object> params = (Map<String, Object>)JSON.deserializeUntyped(request.requestbody.tostring());
    // Iterate through each parameter field and value
    for(String fieldName : params.keySet()) {
        // Set the field and value on the Case sObject
        thisCase.put(fieldName, params.get(fieldName));
    }
    update thisCase;
    return thisCase.Id;
}
Pour invoquer la méthode PATCH :
  1. Dans Workbench REST Explorer, cliquez sur PATCH.
  2. Pour l’URI, entrez /services/apexrest/Cases/<ID d’enregistrement>. Remplacez <ID d’enregistrement> par l’ID de l’enregistrement de requête que vous avez créé précédemment. Entrez le code JSON suivant dans le corps de la requête.
    {
      "status" : "Escalated",
      "priority" : "High"
    }

    Ce code JSON comprend deux valeurs de champ : status et priority. La méthode updateCaseFields récupère ces valeurs à partir du code JSON soumis, puis elles sont utilisées pour spécifier les champs à mettre à jour dans l’objet.

  3. Cliquez sur Exécuter.

    Cette requête invoque la méthode updateCaseFields de votre service REST. Les champs État et Priorité de l’enregistrement de requête sont mis à jour pour adopter les nouvelles valeurs. Pour vérifier ces champs, affichez cet enregistrement dans Salesforce en naviguant vers https://yourInstance.salesforce.com/<ID d’enregistrement>.

Tester votre classe REST Apex

Le test de votre classe REST Apex est similaire au test de toute autre classe Apex. Il suffit d’appeler les méthodes de classe en transmettant les valeurs de paramètres puis en vérifiant les résultats. Pour les méthodes n’acceptant pas de paramètres ou reposant sur des informations de la requête REST, créez une requête REST de test.

En règle générale, voici comment vous testez vos services REST Apex. Pour simuler une requête REST, créez RestRequest dans la méthode test, puis définissez les propriétés de la requête de la manière suivante. Vous pouvez aussi ajouter les paramètres que vous « transmettez » dans la requête pour simuler les paramètres d’URI.

// Set up a test request
RestRequest request = new RestRequest();

// Set request properties
request.requestUri =
    'https://yourInstance.salesforce.com/services/apexrest/Cases/'
    + recordId;
request.httpMethod = 'GET';

// Set other properties, such as parameters
request.params.put('status', 'Working');

// more awesome code here....
// Finally, assign the request to RestContext if used
RestContext.request = request;

Si la méthode que vous testez accède aux valeurs de la requête par le biais de RestContext, affectez la requête à RestContext pour la remplir (RestContext.request = request;).

Enregistrons maintenant la classe complète dans la Developer Console et générons les résultats.

  1. Dans la Developer Console, sélectionnez Fichier | Nouveau | Classe Apex.
  2. Saisissez le nom de classe CaseManagerTest, puis cliquez sur OK.
  3. Remplacez le code généré automatiquement par la définition de classe suivante :
    @IsTest
    private class CaseManagerTest {
    
        @isTest static void testGetCaseById() {
            Id recordId = createTestRecord();
            // Set up a test request
            RestRequest request = new RestRequest();
            request.requestUri =
                'https://yourInstance.salesforce.com/services/apexrest/Cases/'
                + recordId;
            request.httpMethod = 'GET';
            RestContext.request = request;
            // Call the method to test
            Case thisCase = CaseManager.getCaseById();
            // Verify results
            System.assert(thisCase != null);
            System.assertEquals('Test record', thisCase.Subject);
        }
    
        @isTest static void testCreateCase() {
            // Call the method to test
            ID thisCaseId = CaseManager.createCase(
                'Ferocious chipmunk', 'New', 'Phone', 'Low');
            // Verify results
            System.assert(thisCaseId != null);
            Case thisCase = [SELECT Id,Subject FROM Case WHERE Id=:thisCaseId];
            System.assert(thisCase != null);
            System.assertEquals(thisCase.Subject, 'Ferocious chipmunk');
        }
    
        @isTest static void testDeleteCase() {
            Id recordId = createTestRecord();
            // Set up a test request
            RestRequest request = new RestRequest();
            request.requestUri =
                'https://yourInstance.salesforce.com/services/apexrest/Cases/'
                + recordId;
            request.httpMethod = 'GET';
            RestContext.request = request;
            // Call the method to test
            CaseManager.deleteCase();
            // Verify record is deleted
            List<Case> cases = [SELECT Id FROM Case WHERE Id=:recordId];
            System.assert(cases.size() == 0);
        }
    
        @isTest static void testUpsertCase() {
            // 1. Insert new record
            ID case1Id = CaseManager.upsertCase(
                    'Ferocious chipmunk', 'New', 'Phone', 'Low', null);
            // Verify new record was created
            System.assert(Case1Id != null);
            Case case1 = [SELECT Id,Subject FROM Case WHERE Id=:case1Id];
            System.assert(case1 != null);
            System.assertEquals(case1.Subject, 'Ferocious chipmunk');
            // 2. Update status of existing record to Working
            ID case2Id = CaseManager.upsertCase(
                    'Ferocious chipmunk', 'Working', 'Phone', 'Low', case1Id);
            // Verify record was updated
            System.assertEquals(case1Id, case2Id);
            Case case2 = [SELECT Id,Status FROM Case WHERE Id=:case2Id];
            System.assert(case2 != null);
            System.assertEquals(case2.Status, 'Working');
        }    
    
        @isTest static void testUpdateCaseFields() {
            Id recordId = createTestRecord();
            RestRequest request = new RestRequest();
            request.requestUri =
                'https://yourInstance.salesforce.com/services/apexrest/Cases/'
                + recordId;
            request.httpMethod = 'PATCH';
            request.addHeader('Content-Type', 'application/json');
            request.requestBody = Blob.valueOf('{"status": "Working"}');
            RestContext.request = request;
            // Update status of existing record to Working
            ID thisCaseId = CaseManager.updateCaseFields();
            // Verify record was updated
            System.assert(thisCaseId != null);
            Case thisCase = [SELECT Id,Status FROM Case WHERE Id=:thisCaseId];
            System.assert(thisCase != null);
            System.assertEquals(thisCase.Status, 'Working');
        }  
    
        // Helper method
        static Id createTestRecord() {
            // Create test record
            Case caseTest = new Case(
                Subject='Test record',
                Status='New',
                Origin='Phone',
                Priority='Medium');
            insert caseTest;
            return caseTest.Id;
        }          
    
    }
  4. Appuyez sur CTRL+S pour enregistrer.
  5. Exécutez tous les tests de votre organisation en sélectionnant Test | Tout exécuter.

Les résultats des tests s’affichent dans l’onglet Tests. Une fois l’exécution des tests terminée, vérifiez la ligne CaseManager dans le volet Couverture globale du code. Il est couvert à 100 %.

En savoir plus...

Informations complémentaires sur les types de données et espaces de noms pris en charge dans le REST Apex, les API Salesforce et les considérations de sécurité.
Types de données pris en charge pour le REST Apex
Le REST Apex prend en charge les types de données suivants les paramètres et les valeurs retournées.
  • Primitifs Apex (à l’exception de sObject et Blob).
  • sObject
  • Listes ou mappages de primitifs ou de sObject Apex (seuls les mappages à clés de chaîne sont pris en charge).
  • Types définis par l’utilisateur contenant les variables membres des types listés ci-dessus.
Espaces de noms des points de terminaison REST Apex
Les méthodes REST Apex peuvent être utilisées dans des packages gérés et non gérés. Lorsque vous appelez les méthodes REST Apex contenues dans un package géré, vous devez inclure l’espace de noms de ce package géré dans l’URL d’appel REST. Par exemple, si la classe est contenue dans un espace de noms de package géré nommé packageNamespace alors que les méthodes REST Apex utilisent un mappage d’URL de /MyMethod/*, l’URL utilisée via le REST pour appeler ces méthodes prendrait la forme https://instance.salesforce.com/services/apexrest/packageNamespace/MyMethod/.
Services Web Apex personnalisés et API Salesforce
Au lieu d’utiliser du code Apex personnalisé pour les services REST et SOAP, les applications externes peuvent intégrer Salesforce grâce aux API REST et SOAP de Salesforce. Avec ces API, vous pouvez créer, mettre à jour et supprimer des enregistrements. Cependant, l’avantage de l’utilisation des services Web Apex réside dans le fait que les méthodes Apex peuvent encapsuler une logique complexe. Cette logique est masquée dans l’application consommatrice. Par ailleurs, les opérations de classe Apex peuvent s’avérer plus rapides que la création d’appels d’API individuels, car les allers-retours intervenant entre le client et les serveurs Salesforce sont moins nombreux. Avec un appel de service Web Apex , une seule requête est envoyée, et toutes les opérations de la méthode sont effectuées sur le serveur.
Considérations sécurité concernant les services Web Apex
Le contexte Sécurité sous lequel les méthodes du service Web s’exécutent diffère de celui des API Salesforce. Contrairement aux API Salesforce , les méthodes de service Web Apex s’exécutent avec des privilèges système et ne respectent pas les autorisations Champs et objets de l’utilisateur. Cependant, les méthodes de service Web Apex appliquent des règles de partage lorsqu’elles sont déclarées avec le mot clé with sharing.