无法让基本 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);
这是非常基础的。根据我读过的内容,这应该有效。我也有一个更复杂的版本。
下面列出的 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);