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