无法让基本 HTTP Post 在 Salesforce Apex Callout 中工作

Can't get basic HTTP Post to work in Salesforce Apex Callout

这是非常基础的。根据我读过的内容,这应该有效。我也有一个更复杂的版本。

下面列出的 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);

这是 API 接受的 JSON 的示例。

{
    "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(这也有效)

Gareth Jordan 的解决方案同样有效。

对于第一部分,调用 setBody 一次,您对 setBody 的 3 次调用只是相互覆盖。

对于json生成器部分,你是双重编码,变量pretty包含有效生成的json,不需要调用json.serialize它。

为什么不为您的 body 制作一个简单的 class(或内部 class)并使用 JSON.serialize(有效负载)。它使它更清晰。

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