无法在Salesforce Apex标注中使用基本的HTTP发布

时间:2018-06-26 21:55:42

标签: salesforce apex

这是非常基本的。根据我的阅读,这应该可以工作。我也有一个更复杂的版本。

下面列出的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的解决方案也可以工作。

2 个答案:

答案 0 :(得分:1)

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

对于json生成器部分,您进行了双重编码,变量pretty包含有效生成的json,无需调用json.serialize

答案 1 :(得分:1)

为什么不只是为您的身体创建一个简单的类(或内部类)并使用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);