8

我正在使用 NodeJS 调用新的 MailChimp 3.0 API,以便将电子邮件添加到列表中。虽然我可以通过 POSTman 让它工作,但我很难使用 Node 的 http:

var http = require('http');

var subscriber = JSON.stringify({
    "email_address": "test@test.com", 
    "status": "subscribed", 
    "merge_fields": {
        "FNAME": "Tester",
        "LNAME": "Testerson"
    }
});

var options = {
    host: 'https://us11.api.mailchimp.com',
    path: '/3.0/lists/<myListID>/members',
    method: 'POST',
    headers: {
        'Authorization': 'randomUser myApiKey',
        'Content-Type': 'application/json',
        'Content-Length': subscriber.length
    }
}

var hreq = http.request(options, function (hres) {  
    console.log('STATUS CODE: ' + hres.statusCode);
    console.log('HEADERS: ' + JSON.stringify(hres.headers));
    hres.setEncoding('utf8');

    hres.on('data', function (chunk) {
            console.log('\n\n===========CHUNK===============')
            console.log(chunk);
            res.send(chunk);
    });

    hres.on('end', function(res) {
            console.log('\n\n=========RESPONSE END===============');
    });

    hres.on('error', function (e) {
            console.log('ERROR: ' + e.message);
    }); 
});

hreq.write(subscriber);
hreq.end();

然而,我得到的不是来自 Mailchimp 的某种 JSON 错误,而是 HTML: 400 Bad Request

400 错误请求


nginx

很清楚我在这里做错了什么吗?看起来很简单,但我尝试过的任何方法似乎都不起作用。

一些额外的想法:

  1. 虽然 http 的选项具有“auth”属性,但我使用标头来确保在没有编码的情况下发送授权(如此处所述)。尽管如此,我也尝试过使用“auth”属性,并且得到了相同的结果。
  2. 我实际上是从ExpressJS API内部进行这个调用的(我的客户端调用 Express API,它调用了上面的代码——为了简单起见,我已经编辑了这个例子中的所有内容)。这就是为什么我的变量是“hres”和“hreq”,以将它们与 Express 中的“res”和“req”区分开来。有什么原因可能是这个问题吗?
  3. 如上所述,我在使用 POSTman能够获得成功的结果,所以我至少知道我的主机、路径、列表 ID 和 API 密钥是正确的。
4

3 回答 3

5

事实证明,这有一个非常简单的解决方案:选项对象的“主机”属性需要域名即可。IE,去掉“https://”协议:

var options = {
    host: 'us11.api.mailchimp.com',
    path: '/3.0/lists/<myListID>/members',
    method: 'POST',
    headers: {
        'Authorization': 'randomUser myApiKey',
        'Content-Type': 'application/json',
        'Content-Length': subscriber.length
    }
}
于 2015-10-02T15:07:26.073 回答
4

试试这个,它对我来说很好用。

var request = require('request');

function mailchimpAddListCall(email, cb){
var subscriber = JSON.stringify({
        "email_address": email,
        "status": "subscribed"
    });

request({
             method: 'POST',
             url: 'https://us13.api.mailchimp.com/3.0/lists/<Your list id>/members',
             body: subscriber,
             headers:
                    {
                        Authorization: 'apikey <your Mailchimp API key>',
                        'Content-Type': 'application/json'
                    }

         },
          function(error, response, body){
            if(error) {
                cb(err, null)
            } else {

                var bodyObj = JSON.parse(body);
                console.log(bodyObj.status);
                if(bodyObj.status === 400){
                    cb(bodyObj.detail, null);
                }
                var bodyObj = JSON.parse(body);
                cb(null, bodyObj.email_address +" added to list.");
            }
        });
}

request是一个节点模块,您需要将其安装到您的 package.json 中。npm install --save request

于 2016-06-23T08:13:51.117 回答
0

您可以使用authAPI v3 很好地使用这些属性,但如果您获得 400,那不是问题。400 错误的正文应该提供更详细的信息,但有一件事会立即跳出来:MailChimp 不允许将假冒或假冒的电子邮件添加到列表中(如 test@test.com),所以我会尝试一个真实的地址,看看是否适合你。

于 2015-10-02T06:16:44.533 回答