如何使用ReactJS,Axios和Mailchimp发帖并获取请求?

时间:2017-07-01 04:57:09

标签: javascript reactjs mailchimp

我是ReactJS的新手,我正在尝试构建这个需要使用mailchimp的应用程序,以便用户可以订阅时事通讯。我需要使用axios发出请求吗?有人可以引导我通过这个吗?我把api键放在哪里?我是否在波纹管代码中更正了?我把我的mailchimps用户名放在'用户名'我的apikey在' xxxxxxxxxxxxxxxxxxx-us16'但是,我得到401错误说未经授权,但我的控制台确实说Fetch Complete:POST并且没有发现任何错误。

import React, {Component} from 'react';
import './Subscribe.css';

class Subscribe extends Component {
  sub = () => {
    let authenticationString = btoa('username:xxxxxxxxxxxxxxxxxxx-us16');
    authenticationString = "Basic " + authenticationString;

    fetch('https://us16.api.mailchimp.com/3.0/lists/xxxxxxxxx/members', {
      mode: 'no-cors',
      method: 'POST',
      headers: {
        'Authorization': authenticationString,
        'Accept': 'application/json',
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        email_address: "somedude@gmail.com",
        status: "subscribed",
      })
    }).then(function(e){
        console.log('complete')
    }).catch(function(e){
        console.log("fetch error");
    })
  };

  render () {
    return(
      <div>
        <button onClick={this.sub}> subscribe </button>
      </div>
    );
  };
};

3 个答案:

答案 0 :(得分:1)

在文档中,curl示例使用--user标志。使用this将curl命令转换为等效的js代码,您需要在fetch的option对象上使用'auth'属性才能使其正常工作。

fetch('https://us16.api.mailchimp.com/3.0/lists/xxxxxxxxx/members', {
  method: 'POST',
  headers: {
    'content-type': 'application/json'
  },
  body: JSON.stringify({
    email_address: "somedude@gmail.com",
    status: "subscribed",
  },
  auth: {
    'user': 'username',
    'pass': 'xxxxxxxxxxxxxxxxxxx-us16'
  })
})

答案 1 :(得分:1)

花了我一段时间才能正确地实现语法。这是使用axios在服务器端渲染的reactjs应用程序中使用nodejs的工作请求的示例。

由于“ 401”错误,似乎“获取”请求不适用于此方法:MailChimp does not support client-side implementation of our API using CORS requests due to the potential security risk of exposing account API keys.

但是,修补,放置和发布似乎效果很好。

示例(使用异步/等待)

// Mailchimp List ID
let mcListId = "xxxxxxxx";

// My Mailchimp API Key
let API_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxxx-us12";

// Mailchimp identifies users by the md5 has of the lowercase of their email address (for updates / put / patch)
let mailchimpEmailId = md5(values["unsubscribe-email-address"].toLowerCase());

var postData = {
    email_address: "somedude@gmail.com",
    status: "subscribed"
};

// Configure headers
let axiosConfig = {
    headers: {
        'authorization': "Basic " + Buffer.from('randomstring:' + API_KEY).toString('base64'),
        'Accept': 'application/json',
        'Content-Type': 'application/json'
    }
};

try {
    let mcResponse = await axios.post('https://us12.api.mailchimp.com/3.0/lists/' + mcListId + '/members', postData, axiosConfig)
    console.log("Mailchimp List Response: ", mcResponse);

} catch(err) {
    console.log("Mailchimp Error: ", err);
    console.log("Mailchimp Error: ", err["response"]["data"]);
}

答案 2 :(得分:-1)

您可以使用此处描述的方法:AJAX Mailchimp signup form integration

您将需要使用JSONP,否则您将收到CORS错误。

如果您使用现代环境(我的意思不是jQuery),您可以使用qsqueryString等库来将表单数据转换为uri。

您的最终网址可能类似于:

jsonp(`YOURMAILCHIMP.us10.list-manage.com/subscribe/post-json?u=YOURMAILCHIMPU&${queryString.stringify(formData)}`, { param: 'c' }, (err, data) => {
  console.log(err);
  console.log(data);
});

有点hacky,我想Mailchimp可以将它从一天移到另一个,因为它没有记录,所以如果你能避免它,你最好这样做。