Не удается получить базовую HTTP-публикацию для работы с Salesforce Apex Callout - PullRequest
0 голосов
/ 27 июня 2018

Это довольно просто. Исходя из того, что я прочитал, это должно работать. У меня есть и более сложная версия этого.

Параметр To, указанный ниже, представляет собой список строк. From и Body - это строки.

Http http = new Http();
          HttpRequest request = new HttpRequest();
          request.setEndpoint('https://api.testdomain.com/batchemail');
          request.setHeader('Authorization', 'Bearer ' + token);   
          request.setMethod('POST');
          request.setHeader('Accept', '*/*');
          request.setHeader('Content-Type', 'application/json;charset=UTF-8');
          // Set the body as a JSON object
          request.setBody('{"To": ["to@email.com"]}');
          request.setBody('{"From": "from@email.com"}');
          request.setBody('{"Body": "Test message"}');
          HttpResponse response = http.send(request);

Вот пример JSON, который принимает API.

{
    "to": ["to@email.com"],
    "from": "from@email.com",
    "body": "Test message"
}

Конечная точка была добавлена ​​в настройках удаленного сайта.

Есть идеи, почему это не работает? Буду признателен за любую оказанную помощь. Спасибо!

ОБНОВЛЕНИЕ 1 (это работает)

request.setBody('{"To": ["to@email.com"], "From": "from@email.com", "Body": "Test message." }');

ОБНОВЛЕНИЕ 2 (это тоже работает)

JSONGenerator gen = JSON.createGenerator(true);
          // Write data to the JSON string.
          gen.writeStartObject();
          gen.writeObjectField('to', emailList);
          gen.writeStringField('from', 'from@email.com');
          gen.writeStringField('body', message);
          gen.writeEndObject();

          // Get the JSON string.
          String pretty = gen.getAsString();

          request.setBody(pretty);

Обновление 3 (это также работает)

Решение Гарета Джордана также работает.

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Почему бы просто не создать простой класс (или внутренний класс) для своего тела и использовать JSON.serialize (payload). Это делает его чище и яснее.

class Payload{
    String[] to;
    String sender;
    String body;

     public Payload(String[] recipients, String sender, String message){
        this.to = recipients;
        this.sender = sender;
        this.body = message;
    }
}

Тогда ваш код будет

Http http = new Http();
HttpRequest request = new HttpRequest();

request.setEndpoint('https://api.testdomain.com/batchemail');
request.setHeader('Authorization', 'Bearer ' + token);   
request.setMethod('POST');
request.setHeader('Accept', '*/*');
request.setHeader('Content-Type', 'application/json;charset=UTF-8');
Payload body = new Payload(emailList, 'from@email.com','Test Message'); 
request.setBody(JSON.serialize(body).replace('"sender"','"from"'));
HttpResponse response = http.send(request);
0 голосов
/ 27 июня 2018

Для первой части, позвоните setBody один раз, ваши 3 звонка на setBody просто перезаписывают друг друга.

для части генератора json, вы используете двойное кодирование, переменная pretty содержит действительный сгенерированный json, нет необходимости вызывать json.serialize it.

...