Skip to content

L’appel du paramètre de chaîne de requête d’ID à RestResource génère une erreur

Solution:

Mettre à jour

J’ai aussi pu faire votre HttpPost méthode de travail en déplaçant la création vers un @future méthode.

@RestResource(urlMapping='/createLead/*')
global with sharing class CreateLeadRest{
    @HttpPost
    global static void doPost()
    {
        insertLead(RestContext.request.params.get('id'));
    }
    @future
    public static void insertLead(String id)
    {
        Lead newLead = new Lead();
        newLead.Company='test';
        newLead.LastName="test";
        newLead.Description=id;
        insert newLead;
    }
}

Si vous avez des conflits @future les appels vous gênent, envisagez d’utiliser un Queueable la mise en oeuvre. Vous devriez probablement développer un cadre asynchrone défensif si vous prévoyez d’exécuter une logique asynchrone directement dans vos déclencheurs. Je sais que Dan Appleman a écrit beaucoup de matériel sur le sujet, et comment utiliser correctement un framework asynchrone est quelque peu en dehors de la portée de cette question.


Réponse originale

Tout d’abord, vous devriez également regarder ceci Stack Overflow Publier: Comment les paramètres sont-ils envoyés dans une requête HTTP POST ? Paramètres d’URI et POST les demandes sont fondamentalement incompatible.

Au lieu de cela, vous devriez viser un modèle plus similaire à la façon dont la documentation présente POST demandes dans Création d’API REST à l’aide d’Apex REST (à l’aide de POST, PUT et PATCH).

La façon dont vous accéderiez normalement POST paramètres via Apex REST ressemble plus à :

@RestResource(urlMapping='/createLead/*')
global with sharing class CreateLeadRest{
    @HttpPost
    global static void doPost(String id) {   
        Lead newLead = new Lead();
        newLead.Company='test';
        newLead.LastName="test";
        newLead.Description=id;
        insert newLead;
    }
}

Ensuite, si vous passez les paramètres dans le Corps, votre demande doit réussir:

Sommaire

Method: POST
Endpoint: /services/apexrest/createLead/
Payload: {"id": 123}

Capture d’écran

Method:POST;Endpoint:/services/apexrest/createLead/;Payload:{"id":123}

Alors que toute tentative de passer des paramètres via le URI devrait échouer:

Sommaire

Method: POST
Endpoint: /services/apexrest/createLead/?id=123
Payload: {"id": 123}

Capture d’écran

Method:POST;Endpoint:/services/apexrest/createLead/?id=123;Payload:{"id":123}

La raison pour laquelle vous obtenez cette erreur est que Lead a obligatoirement le champ LastName.

Il semble que l’outil que vous utilisez ne fournisse pas d’informations complètes, je recommanderais d’utiliser l’extension Chrome Postman. Cela donnera HTTP 500 et :

[
{
“errorCode”: “APEX_ERROR”,
“message”: “System.DmlException: Insert failed. First exception on row 0; first error: REQUIRED_FIELD_MISSING, Required fields are missing: [LastName]: [LastName]nnClass.CreateLeadRest.doPost : ligne 12, colonne 1” } ]

ou vous pouvez ajouter à votre code quelque chose comme :

url: https://naxx.salesforce.com/services/apexrest/createLead?id=50036000000xxxx

global static String doPost() { 
//..
try {
    insert newLead;
} catch (exception e){
    return e.getMessage();
}

return newLead.id;



Articles Similaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.