2015-10-01 18 views
8

Sto utilizzando NodeJS per chiamare la nuova API MailChimp 3.0 per aggiungere un messaggio di posta elettronica a un elenco. Mentre io posso farlo funzionare via postino, sto avendo un momento difficile con http del nodo:Mailchimp API v3.0 aggiungi e-mail all'elenco tramite NodeJS http

var http = require('http'); 

var subscriber = JSON.stringify({ 
    "email_address": "[email protected]", 
    "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(); 

Piuttosto che ottenere anche una sorta di errore JSON da Mailchimp, però, mi sto HTML: 400 Bad Request

400 Richiesta


nginx

E 'chiaro a tutti quello che io "m facendo male qui? sembra abbastanza semplice, ma nulla ho provato sembra funzionare.

Qualche considerazione aggiuntivi:

  1. Mentre il http opzioni hanno una proprietà "auth", sto usando le intestazioni invece per garantire l'autorizzazione viene inviato senza la codifica (as mentioned here). Tuttavia, ho anche provato con la proprietà "auth" e ottengo lo stesso risultato.
  2. In realtà sto effettuando questa chiamata da all'interno di un'API ExpressJS (il mio client chiama l'API Express, che chiama il codice precedente - Ho modificato tutto questo da questo esempio per semplicità). Ecco perché le mie variabili sono "hres" e "hreq", per distinguerle da "res" e "req" in Express. C'è qualche ragione che potrebbe essere il problema?
  3. Come accennato in precedenza, I am sono in grado di ottenere risultati positivi quando si utilizza POSTman, quindi almeno il mio host, percorso, ID elenco e chiave API sono corretti.
+0

Hai provato a utilizzare il modulo https di Node? Solo un pensiero. –

risposta

3

Si è trattato di una soluzione molto semplice: la proprietà "host" dell'oggetto opzioni doveva avere il solo il nome di dominio. IE, rimuovi il protocollo "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 
    } 
} 
+0

Ho anche dovuto specificare il protocollo: "https:", altrimenti avrei rifiutato la connessione. – Legoless

0

È possibile utilizzare le proprietà auth bene con API v3, ma se si ottiene un 400, non è questo il problema. Il corpo dell'errore 400 dovrebbe fornire informazioni più dettagliate, ma una cosa che salta immediatamente: MailChimp non consente l'aggiunta di e-mail false o false agli elenchi (come [email protected]), quindi proverei un vero indirizzo e vedi se questo funziona per te.

4

Prova questo, funziona bene per me.

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."); 
      } 
     }); 
} 
+0

Potrebbe essere utile definire cosa è richiesta qui, perché questo non funziona con la libreria built-in require ('http'). – Legoless

+0

@Legoless è un modulo nodo - richiesta di installazione npm e quindi var request = require ('richiesta') per usarlo come fa WAQAR qui –

Problemi correlati