问题描述
我正在尝试使用连接到外部mailchimp API的google doc和google app脚本自动将订阅者添加到mailchimp邮件列表中。每当我尝试测试脚本时,都会从StackDriver Log中收到“错误值”异常。
var payload = {
"email_address": email,"status_if_new": "subscribed","merge_fields": {
FNAME: first_name,LNAME: last_name
},};
var headers = {
"contentType": "application/json","Authorization": "apikey " + API_KEY,};
var data = {
"method": "PUT","muteHttpExceptions": false,"headers": headers,"payload": payload,};
var json = Utilities.jsonStringify(data);
//DEBUG
Logger.log(json);
Logger.log(endpoint);
// call the Mailchimp API
try {
var response = UrlFetchApp.fetch(endpoint,json);
if (response.getResponseCode() === 200) {
// all good!
Logger.log("Success");
Logger.log(response);
} else {
Logger.log("Issues");
Logger.log(response);
}
} catch (err) {
// handle the error here
Logger.log("Error");
Logger.log(err);
}
Sep 5,2020,1:02:53 PM Info Exception: Bad value
在进一步研究curl时,我发现手动发送具有相同有效负载和标头的请求会给出此响应。
curl -X PUT 'https://{server}.api.mailchimp.com/3.0/lists/{my_list}/members/{member_hash}'
-H {"Authorization":"apikey {API_KEY}","contentType":"application/json"}
-d '{"email_address":"test@test.com","status_if_new":"subscribed","merge_fields":{"LNAME":"test","FNAME":"test"}},"muteHttpExceptions":false}'
"errors":[{"field":"email_address","message":"This value should not be blank."}]
为什么API无法识别我提供的电子邮件?
解决方法
主要问题是您要传递一个JSON字符串作为params
参数,其中UrlFetchApp.fetch(url,params)
中应该有一个对象。无需对所有data
进行字符串化,只需要对有效载荷进行字符串化即可。 (请注意Apps脚本文档中链接的示例。)
我怀疑您还会遇到Utilities.jsonStringify()
的问题,因为它是deprecated。请改用JSON.stringify()
。
我也将contentType从headers
移到了data
,因为这是在fetch()
方法中指定的方式,但实际上对您的应用程序没有影响。
var payload = {
"email_address": email,"status_if_new": "subscribed","merge_fields": {
FNAME: first_name,LNAME: last_name
},};
var headers = {
"Authorization": "apiKey " + API_KEY
};
var data = {
"method": "PUT","muteHttpExceptions": false,"headers": headers,"contentType": "application/json","payload": JSON.stringify(payload) // The payload should be stringified
};
//DEBUG
Logger.log(endpoint);
// call the Mailchimp API
try {
var response = UrlFetchApp.fetch(endpoint,data); // pass in data,not json
if (response.getResponseCode() === 200) {
// all good!
Logger.log("Success");
Logger.log(response);
} else {
Logger.log("Issues");
Logger.log(response);
}
} catch (err) {
// handle the error here
Logger.log("Error");
Logger.log(err);
}
如果您只是 要添加订户,那么我建议您使用add members to list端点。只是简单一点,不需要您生成成员哈希。